使用gdb调试附加进程 - 如何从循环中转义

时间:2011-03-05 16:14:45

标签: c++ c debugging gdb

我正在调试看起来像这样的代码:

while (true){
   // do something ...
   size_t i = foo();  // <- bp set here
   if (flag_set) break;
}

// More code follows here ...

我想在foo()函数调用中断,调用它几次然后完全跳出while循环(假设我们保证将设置标志 - 所以我们可以突破循环。

如何彻底摆脱循环?完成只是运行到下一次迭代。我想要做的是退出当前的“代码块”(在这种情况下,while循环)

5 个答案:

答案 0 :(得分:2)

您需要advance命令,它使用与break命令相同的参数。以您的代码为例(但添加了行号):

10 while (true){
11   // do something ...
12   size_t i = foo();  // <- bp set here
13   if (flag_set) break;
14 }
15 
16 // More code follows here ...
17 someFunction();

假设第12行的原始断点是断点1,在断开几次之后你想跳到第17行,你会输入类似的东西:

禁用1

提前17

会禁用断点1(因此它不会被循环的其余部分命中)然后继续执行程序直到它到达第17行。

答案 1 :(得分:1)

在循环之前设置断点。然后将光标移至foo()调用,并使用Debug|Run to Line。这非常有用,我已经为它专门设置了一个功能键。

答案 2 :(得分:0)

在循环后设置第二个断点。 disable循环内的断点。 cont。再次enable断点。

我不知道有什么更简单的方法。

答案 3 :(得分:0)

尝试使用jump命令。每个gdb帮助,至少在这个系统上:

jump -- Continue program being debugged at specified line or address

答案 4 :(得分:0)

您需要的是直到命令。这是避免单步循环的最简单方法。来自gdb manual

  

继续运行,直到到达当前堆栈帧中当前行的源行。此命令用于避免单次单步执行循环。它就像下一个命令,除了直到遇到跳转时,它会自动继续执行,直到程序计数器大于跳转的地址。