我们怎样才能跳过 GDB 中的函数调用?

How can we step over a function call in GDB?

我想了解如何单步执行函数调用。例如,在下面最简单的程序中:

 #include <iostream>
 #include "test.h"

 using std::cout;
 using std::endl;

 Uint u;

 int main()
 {
     cout << "execution starting..." << endl;
     cout << u.a << endl;
     cout << "execution completed" << endl;
 }

好的,我通过break 11命令在第11行设置断点。现在我想跳过所有将被调用以打印 "execution starting..." 的指令,并在 operator << 调用处停止以打印 endl 符号。我怎样才能做到这一点?我应该使用哪个命令?

在GDB中,step表示进入(将进入调用的函数内部),next表示跳过(继续并在下一行停止)。

但在你的特定情况下,next 可能不是你想要的,我建议先 step 到打印“执行开始...”的函数中,然后使用 finish 继续,直到 returns,这样程序将停止在 <<endl

如果设置了断点,那么只需使用continue 继续执行直到该断点。除非你想 完全跳过 这些调用,否则你只需将 $eip$rip 设置为你的断点地址,例如 set $[e|r]ip=0x[your_address]