使用gdb调试程序
时间:2011-05-02 来源:qiang.xu
1. 使用gdb调试程序
1.1 编译源代码
1.2 如何进入,退出gdb
1.3 浏览源代码
1.3.1 list命令
1.3.2 如何在gdb查找字符串
1.4 break point断点
1.4.1 设置断点
1.4.2 删除断点
1.4.3 查看断点信息
1.5 watch point监视点
1.5.1 设置监视点
1.5.2 查看监视变量的内容
1.6 catchpoints
1.7 让程序运行起来
1.8 查看变量
2. clewn
2.1 安装
2.2 简单使用
3. ddd
3.1 安装
3.2 使用
4. 相关文件下载及参考资料
<1>. 使用gdb调试程序
1.1 编译源代码
为了使用gdb调试程序的话,需要在使用gcc编译源代码时使用-g的选项,这样才能在编译完的二进制文件中包含调试信息。
xuqiang@ubuntu:~/gdb$ gcc debug.c -g -o debug
1.2 如何开始gdb调试程序和退出gdb程序
编译完成源文件之后,如果生成了二进制文件(上面的例子是debug),此时在debug文件的目录下键入gdb debug进入gdb调试:
xuqiang@ubuntu:~/gdb$ gdb debug
GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i486-linux-gnu"... (gdb)如果想要退出gdb,此时键入quit命令即可:
(gdb) quit
1.3 浏览源代码
现在我们已经能够进入到gdb环境中,我们想要设置断点开始调试,那如果不能够知道在哪里设置断点,就需要“浏览源代码”,找到需要设置断点的位置,然后设置断点。可以使用gdb的list命令或者是通过查找字符串的形式找到需要设置断点的行。
1.3.1 list命令
list命令后可接linenum或者是function-name,同时可以设置list命令每次默认显示的行数。
(gdb) list # 从上次显示行结束位置开始再次显示listsize行
(gdb) list 10 # 显示第10行附近的内容
(gdb) list main # 显示main函数附近的行(gdb) show listsize # 显示默认list命令显示的行数
Number of source lines gdb will list by default is 10.(gdb) show listsize # 设置默认list命令显示的行数
Number of source lines gdb will list by default is 5.1.3.2 如何在gdb查找字符串
在gdb中可以使用search命令查找字符串,并显示所有符合条件的代码,这里可以使用正则表达式。
(gdb) search main
19 int main()1.4 断点
1.4.1 设置断点
(gdb) break main # 在main函数开始运行时,停止
Breakpoint 1 at 0x80483d5: file debug.c, line 22.(gdb) break 26 # 在line 26行设置断点
Breakpoint 2 at 0x80483dc: file debug.c, line 26. (gdb) break debug.c:24 # 在文件debug.c的24行设置断点 Note: breakpoint 2 also set at pc 0x80483dc. Breakpoint 3 at 0x80483dc: file debug.c, line 24.1.4.2 删除断点
(gdb) clear main # 删除main函数上的断点
Deleted breakpoint 1(gdb) clear 26 # 删除26行的断点
Deleted breakpoint 2 (gdb) clear debug.c:main # 删除debug.c文件中main函数上的断点1.4.3 查看断点信息
(gdb) info breakpoints # 查看断点信息 Num Type Disp Enb Address What 3 breakpoint keep y 0x080483dc in main at debug.c:241.5 watch point监视点
1.5.1 设置监视点
(gdb) watch i # 监视变量i,当i的值变化之后,gdb将停止程序运行
Hardware watchpoint 6: i 1.5.2 查看监视变量的内容当所监视的变量发生变化时,gdb将停止程序运行,如下:
Breakpoint 5, main () at debug.c:33 33 i = 10;1.6 catchpoints
catchpoints主要是应用在当某个事件发生时,gdb将停止程序运行。
(gdb) catch fork # 如果程序调用fork函数,gdb将停止程序运行 Catchpoint 8 (fork)1.7 让程序运行起来
如果按照1.2中的方法进入了gdb的调试环境,并且通过浏览源代码设置了断点的话,那么如何让程序跑起来?
1. 运行待调试程序
(gdb) run 2. 如果run之后在断点处停止,使用continue命令继续程序的执行 (gdb) continue3. 使用step进行单步调试
(gdb) step
1.8 查看变量
在程序中如何查看程序变量的值,gdb中可以使用print命令。
(gdb) print p # p为结构体类型
$2 = {x = 0, y = 0} (gdb) print arr # arr为int数组 $3 = {1, 2} (gdb) print a # a为int类型 $4 = 10 (gdb) print *ptr@5 # 其中int* ptr = (int*)malloc(5 * sizeof(int)); $5 = {0, 0, 0, 0, 0}<2>. clewn
2.1 安装
首先下载clewn,解压,进入该目录,执行以下命令即安装完毕。
xuqiang@ubuntu:~/gdb/clewn-1.15$ ./configure
xuqiang@ubuntu:~/gdb/clewn-1.15$ make xuqiang@ubuntu:~/gdb/clewn-1.15$ make install2.2 简单使用
启动clewn,clewn将启动gvim显示源代码:
xuqiang@ubuntu:~/gdb$ clewn -va debug.c
在gdb中载入二进制文件:
(gdb) file debug
Reading symbols from /home/xuqiang/gdb/debug...done.那么现在可以在gvim窗口中使用ctrl+b设置断点:
shift+r开始运行程序,程序将在第一个断点处停止。常用快捷键:
L = info locals
B = info breakpoint
R = run
C = continue
S = step
需要注意的是信息将显示在gdb窗口中。
<3>. ddd
如果上面的clewn还是觉得有点复杂的话,可以使用ddd来调试程序,可以通过apt-get install ddd来安装。使用非常舒服。
<4>. 相关文件下载及参考资料
/Files/xuqiang/gdb-test-sample.rar