序,在main函数入口处断点被hit后我们可以设置rwatch x进行变量监视。
程序恢复:
单步执行:
单步跳过:n = next跳过调用方法的细节,将该行视为一行代码进行执行。next 3表示连续执行三次next。
单步进入:s = step 进入调用方法的细节。
执行到下一断点:c = continue,程序继续执行直到hit下一个断点。
执行到下一栈帧:fin = finish,程序继续执行直到当前栈帧完成。这个常常被用来完成所谓step out的工作,在你不小心按到了step时(你本意其实是想单步跳过),你就可以使用finish跳出该方法。当然,如果你进入了一个迭代函数中的多层以内,可能一个临时断点+continue或者until会更加有用,后者见下文。
执行到具有更高内存地址的机器指令:u = until (后边可以跟上funtionname/linenumber),应用的场景见下边的代码,在我们进入了这个循环后我们想跳出来执行循环后的代码,此时我们当然可以在循环后的第一行代码设置临时断点,然后continue到那,但这个操作会比较麻烦,最好的方式是使用until,该命令使程序继续运行知道遇到一个具有更高内存地址的机器指令时停止,而在循环被编译成机器指令时,会将循环条件放在循环体的最底部,所以利用until正好跳出循环进入下一机器指令(P.S. 你可以使用GCC的-s查看生成的机器指令以便更好的理解这个命令的运行方式): 1: ...previous code...
2: int i = 9999;
3: while (i--) {
4: printf("i is %d ", i);
5: ... lots of code ...
6: }
7: ...future code...
程序反向调试:
这是GDB7以后新加入的功能,如果你在调试的时候发现自己已经错过了想调试的地方,这个操作可以使你不必重新开始调试而直接返回已经执行过的代码进行调试。我们使用下边一个非常简单的程序对这个新版本的功能加以说明: 1: #include
2: void foo() {
3: printf("inside foo()");
4: int x = 6;
5: x += 2;
6: }
7:
8: int main() {
9: int x = 0;
10:&n