1、前提
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:
> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,启动gdb调试。
2、启动gdb进入程序
2.1、以gdb启动程序
1、启动命令:gdb <program>
2、进入gdb后,输入命令:'r或run',执行程序
2.2、调试正在运行的程序
1、通过命令'ps -ef|grep <进程名>'获取正在运行的进程号pid
2、进入程序通过命令'gdb -p <pid>'
3、设置断点
3.1、常见设置断点的方式
用break命令来设置断点。设置断点的方法:
1、在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数 名:break <function>
2、在指定行号停住: break <linenum>
3、在当前行号的前面或后面的offset行停住。offiset为自然数:
break +offset
break -offset
4、在源文件filename的linenum行处停住: break filename:linenum
5、 在源文件filename的function函数的入口处停住: break filename:function
6、在程序运行的内存地址处停住: break *address
7、break命令没有参数时,表示在下一条指令处停住:break
8、 break ... if <condition>
...可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
3.2、查看设置的断点信息
查看断点时,可使用info命令,如下所示:(注:n表示断点号)
info breakpoints [n]
info break [n]
4、调试,查看信息
4.1、调试
当程序遇到断点,可以用continue 命令恢复程序的运行直到程序结束,或到下一个断点。
也可以使用step或next命令单步跟踪程序。
4.2、查看信息
4.2.1、查看信息表达式
在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p)。print命令的格式是:
print <expr>
print /<f> <expr>
<expr>是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),<f>是输出的格式,比如,如果要把表达式按16进制的格式输出,那么就是/x。
4.2.2、gdb常见输出格式
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
4.2.2、实例
1、直接查看变量:p x
2、以某浮点数查看变量: p/f x
3、查看数组: p *array@len
@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度,其保存在变量len中