User:GDB
gdb使用心得
最为linux下coder居家必备的好debug工具,gdb给我们带来很对可视化debug工具所不能的便利。我用gdb时间也不长,但也分享一下所得。
以调试c++程序为例吧(暂时来说我也就会写点c++了),要让程序能够利用gdb调试,编译的时候必须加入-g编译指令(比如
g++ helloworld.cpp -g -o run)
让目标代码带上以供调试的信息。然后在终端输入 gdb 目标代码名(如上面生成的是名为run的可执行文件,则输入 gdb run 回车即可)。将进入gdb。
第一个接触的指令应该是l,每一屏显示10行,回车可以继续显示后继代码。它的作用是列出你的代码。你也可以 l 指定行号 从指定行开始浏览你的代码。这样你
就能确定你的程序。
接下来你就可以设置断点让程序在特定位置中断了。指令是 b 指定行号 。其效果就是在特定行号处设定断点。每个断点都有其唯一的编号,按设定的顺序分配。当
你不再需要这个断点的时候,可以 disable 断点号 来禁用这个断点。还有一个非常好用的功能就是condition,可以在程序满足一定条件才启用断点。其语
法是 condition 已经存在断点号。比如我有一个
for (int i = 0; i < 10; ++i)
的循环语句,而且已经在该语句前设置了标号为1的断点,那么我们可以
condition 1 i == 5
,那么在循环进行到第6次的时候将会进入断点。其他的bool表达式也是同理,表达式的语法与c++同样。当你设置好断点,你可以用
info breakpoints
看到所有断点的信息。
设置好断点就可以执行程序了,指令是 r 。程序如果带有参数在 r 后面直接输入就可以了。输入后程序将运行到断点出或者I/O中断处停止,如果是前者,则
可以用 n 或者 s 进行单步执行,其中 n 是单步但不进函数内部, s 则进入函数内部,也可以用 c 跳过当前断点继续执行;如果是后者你就必须得输入数据了。
在单步过程中我们可以方便地查看变量内容,指令是 p 变量名/表达式 。gdb非常强大地告知你相关信息,数组则会把元素一一列出(元素过多的时候则会提 示你是否继续显示),类的话会把类成员显示,连stl的容器也会把里面的具体内容罗列。我们也可以用监控指定边变量,指令是
watch 变量名/表达式
。当变量的值发生改变的时候可以随即更新。
退出当前程序用 kill ,退出gdb是 quit 。在gdb中也可以执行shell命令,键入 shell 回车就可以了。掌握上面的用法对付基本的调试应该没有问题,至 于gdb更深入的应用比如捕获异常、线程调试等有待进一步学习。