黑马程序员技术交流社区

标题: 【笔记】gdb断点调试的三个实用技巧 [打印本页]

作者: 倾心莫若初见    时间: 2016-10-11 11:12
标题: 【笔记】gdb断点调试的三个实用技巧
本帖最后由 倾心莫若初见 于 2016-10-18 15:02 编辑

gdb断点调试的三个实用技巧


作为程序员,调试是一项很重要的基本功。调试的技巧和水平,直接决定了解决问题的时间。一般情况下,GDB的基本命令已经足以应付大多数问题了。但是,对于有些问题,还是需要更高级一些的命令。
今天给大家介绍GDB功能十分强大的三个调试技巧。checkpoint、condition和ignore。

一,checkpoint
有一些bug,可能很难复现,当好不容易复现一次,且刚刚进入程序的入口时,我们需要珍惜这个来之不易的机会。如果只使用基本命令的话,对于大部分代码,我们都需要使用step来步进。这样无疑会耗费大量的时间,因为大部分的代码可能都没有问题。可是一旦不小心使用next,结果恰好该语句的函数调用返回出错。那么对于这次来之不易的机会,我们只得到了部分信息,即确定问题出在该函数,但是哪里出错还是不清楚。于是还需要再一次的复现bug,时间就这样浪费了。对于这种问题,是checkpoint大显身手的时候了。
checkpoint可以看做程序在那一刻的快照,当我们发现错过了某个调试机会时,可以再次回到checkpoint保存的那个程序状态。
checkpoint的用法很简单,但是很有用。就是在平时的简单的bug修正中,也可以加快我们的调试速度——毕竟减少了不必要的重现bug的时间。
二,condition
调试程序时,程序中如果包含循环调用,但想观察循环中间,此时condition就很有用了,可以根据条件来停止当前的断点。
这个功能很强大,可以在我们设置的条件成立时,自动停止当前的程序,先使用break(或者watch也可以)设置断点,然后用condition来修改这个断点的停止(就是断)的条件。使用方法很简单,如下:
condition <break_number> <expression> 修改当前的断点停止条件为expression为真值condition<break_number> 清楚断点号的停止条件,这样就是一般的断点了。
如,我们想在断点号为1处,参数args的值为root时才停止(断点才断),可以设置如下:condition 1 args="root"。然后如果想清除这个条件,可以这样condition 1
三,ignore
如果我们不是想根据某一条件表达式来停止,而是想断点自动忽略前面多少次的停止,从某一次开始才停止,这时ignore就很有用了。
ignorebreak_number count
上面的命令行表示break_number所指定的断点号将被忽略count次。如:
ignore 1 100,表示忽略断点1的前100次停止

精华推荐:
3分钟带你读懂C/C++学习路线
为什么来黑马程序员学C/C++? 稳做IT贵族人才!
一张贴玩转C/C++:视频+源码+笔记+工具+面试





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2