对于真正意义的调试器来说,gdb在linux下是独一无二的。它有多种包装,有字符界面的,也有图形界面的,有单独运行的,也有集成到IDE中的。gdb功能强大,图形界面的gdb容易上手一点,但功能无疑受到了一些限制,相信大部分高手还是愿意使用字符界面的。
在编译阶段:
在对程序进行编译时,需要在gcc(g++)下使用’-g’选项,这样gdb才能够调试所使用的变量、代码行和函数。
通过两种方式运行gdb:
在shell中,可以使用’gdb 程序名’或’file 程序名’这两种方式来装入程序,之后可以用gdb命令’run’来启动程序。
关于断点的使用:
1. 对于单个文件而言可以直接使用 break linenumber 或b linenumber直接设置断点。
2. 对于比较庞杂的大型软件而言,有时候程序员所关注的代码发生在一系列操作(比如点击菜单)或事件之后,这时候设置断点可以采用如下两种方法:
dir …/example //进入被关注的代码所在的文件夹
break example.cpp:linenumber或者 b example.cpp:linenumber
如果是面向对象语言开发的软件项目,可以用类名+函数名来设置断点
Break classname:functionname
3. 条件断点:
在一些循环语句中,异常情况往往在循环执行若干次后才出现,因此可以用添加条件的方法来让定位异常,以便观察异常发生时各个变量的值。
例如:(gdb) break 21 if value1==value2
Breakpoint 1 at 0x8048428: file eg1.c, line 21.
如果已经在第 21 行中设置了断点,如 1 号断点,则可以使用 'condition' 命令来代替在断点上设置条件:
(gdb) condition 1 value== value2
查看断点信息:info break
取消、删除断点:disable b-number、delete b-number
监视点:
当指定表达式的值改变时,监视点将中断程序执行,但必须在表达式中所使用的变量在作用域中时设置监视点。可以在变量所在作用域的函数上设置断点,然后运行程序,当遇到该函数断点时设置监视点。
堆栈跟踪:
程序“调用堆栈”是当前函数之前的所有已调用函数的列表(包括当前函数)。每个
函数及其变量都被分配了一个“帧”,最近调用的函数在 0 号帧中(“底部”帧)。要打印堆栈,发出命令 'bt'('backtrace' [回溯] 的缩写):
(gdb) bt
#0 0x80483ea in wib (no1=8, no2=8) at eg1.c:7
#1 0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21
实际上,发出 'info locals' 命令时,gdb 会打印出当前帧中的局部变量,缺省情况下,这个帧中的函数就是被中断的函数(0 号帧)。可以使用命令 'frame' 打印当前帧。要查看 main 函数(在 1 号帧中)中的变量,可以发出 'frame 1' 切换到 1 号帧,然后发出 'info locals' 命令。
程序的前行:
单步执行:
Next 或n 单步执行,不进入函数内部,相当于vc中的F10;
Step 或 s 但不执行,进入函数内部,相当于vc中的F11;
Contuinue 程序从当前位置开始顺次执行。
Finish 跳出当前函数的执行
参考:Debugging with GDB------The GNU Source-Level Debugger 4.12
http://www.ibm.com/developerworks/cn/linux/sdk/gdb/