我正在调试看起来像这样的代码:
while (true){
// do something ...
size_t i = foo(); // <- bp set here
if (flag_set) break;
}
// More code follows here ...
我想在foo()函数调用中断,调用它几次然后完全跳出while循环(假设我们保证将设置标志 - 所以我们可以突破循环。
如何彻底摆脱循环?完成只是运行到下一次迭代。我想要做的是退出当前的“代码块”(在这种情况下,while循环)
答案 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:
继续运行,直到到达当前堆栈帧中当前行的源行。此命令用于避免单次单步执行循环。它就像下一个命令,除了直到遇到跳转时,它会自动继续执行,直到程序计数器大于跳转的地址。