Step Over 在 GDB 中不起作用

逆向工程 linux 数据库
2021-06-14 20:56:54

在下面的函数中,假设 EIP 是 0x400688。现在,我想跳过调用而不是进入子例程。

    0x40067a <main+4>       sub    $0x20,%rsp                                                                                                         │
   │0x40067e <main+8>       mov    $0x3c00,%edi                                                                                                       │
   │0x400683 <main+13>      mov    $0x0,%eax                                                                                                          │
  >│0x400688 <main+18>      callq  0x400560 <alarm@plt>                                                                                               │
   │0x40068d <main+23>      mov    0x2009ac(%rip),%rax        # 0x601040 <stdout@@GLIBC_2.2.5>                                                        │
   │0x400694 <main+30>      mov    $0x0,%ecx                                                                                                          │
   │0x400699 <main+35>      mov    $0x2,%edx                                                                                                          │
   │0x40069e <main+40>      mov    $0x0,%esi                       

我使用了下一个命令,但是它开始执行 main() 函数本身,而不是只在指令处执行调用和中断:0x40068d,如下所示:

(gdb) next 
Single stepping until exit from function main,
which has no line number information.
2个回答

如上所述,next如果源没有其符号表则将无法工作。您可以使用-g来自 gcc 的选项获取此类调试符号

但除此之外,我认为您正在寻找nexti可以缩短为ni.

next 除非符号表中有源代码行信息,否则将无法按预期工作。

下一篇:跳过函数和文件

继续到当前(最里面)堆栈帧中的下一个源代码行。这与 step 类似,但在代码行中出现的函数调用不会停止执行。当控制到达在您发出下一个命令时正在执行的原始堆栈级别的不同代码行时,执行将停止。该命令缩写为 n。

参数计数是重复计数,对于步骤。

下一个命令仅在源代码行的第一条指令处停止。这可以防止可能在 switch 语句、for 循环等中发生的多次停止。