GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图 形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功 能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
#include
void main()
{
inti;
long result= 0;
for(i=1;i<=100;i++)
{
result += i;
}
printf("result= %d \n", result );
}
1.编译生成可执行文件:
gcc -g tstgdb.c-o tstdgb.o
2.启动GDB
gdb tstgdb.o
[root@localhost Desktop]# gdb tstgdb.o
GNU gdb Red Hat Linux (6.5-37.el5rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.
This GDB was configured as "i386-redhat-linux-gnu"...Using host libthread_db library "/lib/i686/nosegneg/libthread_db.so.1".
3. 在main函数处设置断点
break main(在程序入口main处设置)
(gdb) break main
Breakpoint 1 at 0x8048395: file tstgdb.c, line 5.
4. 运行程序
run
(gdb) run
Starting program: /root/Desktop/tstgdb.o
Breakpoint 1, main () at tstgdb.c:5
5
5. 单步运行
next
(gdb) next
6
(gdb) next
8
6. 继续运行
continue
(gdb) continue
Continuing.
result= 5050
Program exited with code 016.
使用GDB
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。
启动GDB的方法有以下几种:
GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:
GDB命令(演示)
list(l)
break(b) 函数名 在某函数入口处添加断点
break(b) 行号 在指定行添加断点
break(b) 文件名:行号 在指定文件的指定行添加断点
break(b) 行号 if 条件 当条件为真时,指定行号处断点生效,例b 5 if i=10,当i等于10时第5行断点生效
info break
delete 断点编号 删除断点
清除断点(命令为 clear),格式同 break 。例如 :
(gdb) clear filename.c:30
run(r)
next(n)
step(s)
continue(c) 继续运行程序
watch 变量名 对指定变量进行监控
watch 观察一个变量的值。每次中断时都会显示这个变量的值
p print 打印一个变量的值。与watch不同的是print只显示一次
这里在顺便说说如何改变一个 value. 当你下指令 p 的时候,例如你用 p b,
这时候你会看到 b 的 value, 也就是上面的 $1 = 15.
你也同样可以用 p 来改变一个 value, 例如下指令 p b = 100 试试看,
这时候你会发现, b 的 value 就变成 100 了:$1 = 100.
quit(q)