Linux 下的程序调试技术--GDB方式

对于真正意义的调试器来说,gdblinux下是独一无二的。它有多种包装,有字符界面的,也有图形界面的,有单独运行的,也有集成到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-numberdelete 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/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章