gdb教程(3): 断点(breakpoint)和观察点(watchpoint)

在绝大多数情况下,我们并不需要从头开始一步一步的调试程序的。在这种情况下,断点(breakpoint)检查点(watchpoint)就起到了很大的作用。

相关文章

gdb教程(1):如何开始
gdb教程(2):控制程序的执行
gdb教程(3):断点(breakpoint)和观察点(watchpoint)]
gdb教程(4):函数调用栈

断点(breakpoint)

你可以通过设置断点来告诉gdb在程序执行到哪一行的时候暂停,你也可以将断点设置到某一函数上,这样程序会在调用这个函数时停止。然后你可以在这里检查变量的值或者查看程序的堆栈来找到程序中的问题。

将断点设置在某一行

使用break命令(简写为b)加上行号来在对应行设置断点

(gdb) break 19
Breakpoint 1 at 0x80483f8: file test.c, line 19

如果你的程序包括多个文件,你可以通过文件名:行号的形式来指定断点位置

(gdb) break test.c:19
Breakpoint 2 at 0x80483f8: file test.c, line 19

将断点设置在函数上

使用break命令加上对应的函数名来在让程序在调用函数时触发断点

(gdb) break func1
Breakpoint 3 at 0x80483ca: file test.c, line 10

如果你希望将断点设置在c++类的成员函数上,可以使用类名::函数名的形式设置断点

(gdb) break TestClass::testFunc(int) 
Breakpoint 1 at 0x80485b2: file cpptest.cpp, line 16.

管理断点

你可以使用info breakpoints命令来查看当前设置的所有断点

(gdb) info breakpoints
Num Type Disp Enb Address What
2 breakpoint keep y 0x080483c3 in func2 at test.c:5
3 breakpoint keep y 0x080483da in func1 at test.c:10

使用disable(enable)命令来禁用(启用)断点

(gdb) disable 2
(gdb) info breakpoints
Num Type Disp Enb Address What
2 breakpoint keep n 0x080483c3 in func2 at test.c:5
3 breakpoint keep y 0x080483da in func1 at test.c:10

使用delete命令来删除断点

(gdb) delete 2
(gdb) info breakpoints
Num Type Disp Enb Address What
3 breakpoint keep y 0x080483da in func1 at test.c:10

观察点(watchpoint)

观察点与断点类似,他们之间不同的地方在于停止的逻辑,断点让程序在执行到代码的某一行时停止,而观察点让程序在某一变量发生改变时停止。

设置写观察点

#include <stdio.h>

int main(int argc, char **argv)
{

int x = 30;
int y = 10;

x = y;

return 0;
}

以上面的代码为例,如果我们希望程序在变量x被修改时暂停,那么可以使用watch命令。

(gdb) watch x
Hardware watchpoint 4: x
(gdb) c
Continuing.
Hardware watchpoint 4: x

Old value = 30
New value = 10
main (argc=1, argv=0xbffffaf4) at test.c:10
10 return 0;

注意:在使用watch命令观察变量x时,需要确保x处于当前的作用域内。

其他观察点

观察点除了可以监控变量的写操作,还可以监控读操作。使用rwatch来设置读观察点,使用awatch来设置读写观察点

管理观察点

观察点也是断点的一种,因此断点支持的管理操作对观察点同样适用。使用info breakpoints可以查看当前观察点。

(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x080483c6 in main at test.c:5
4 hw watchpoint keep y x

本节到这里就结束了,下一节我会介绍gdb关于函数堆栈的操作。

参考资料

RMS’s gdb Tutorial: How do I use breakpoints?
RMS’s gdb Tutorial: How do I use watchpoints?

此文有用? 求鼓励!

显示 Gitment 评论