GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要有以下四个功能:
- 启动程序,可以按照工程师自定义的要求运行程序;
- 让被调试的程序在工程师的指定的断点处停住,断点可以是条件表达式;
当程序被停住时,可以检查此时程序中所发生的事,并追踪上文;
下面就GDB常用的命令进行介绍:
list命令
list < linenum >:显示程序第linenum行周围的源程序;
- list < function >:显示函数名为function的函数的源程序;
- list:显示当前行后面的源程序;
list -:显示当前行前面的源程序。
run命令
在GDB中,运行程序使用run命令,简写为r。在程序运行前,我们可以设置如下4个方面的工作环境。
(1)程序运行参数:使用set args可指定运行时参数,如set args 10 20 30,用show args命令可查看设定的参数;
(2)运行环境:用path < dir >可设定程序的运行路径,用show paths可查看程序的运行路径;用set environment varname[=value]可设置环境变量,如set env USER=myname;用show environment[varname]则可查看环境变量。
(3)工作目录:cd < dir >相当于shell的cd命令,pwd可现实当前所在的目录;
(4)程序的输入输出:info terminial用于显示程序用到的终端的模式;在GDB中可使用重定向程序输出,如run>outfile;用tty命令可以指定输入输出的终端设备,如/dev/ttyS1。break命令
break命令的作用是设定置断点,简写为b,设置断点的方法如下:
(1)b < function >:在进入函数时停住;
(2)b < linenum >:在指定行号停住;
(3)b +offset / b -offset:在当前行号的前面或者后面的offset行停住;
(4)b filename:linenum:在源文件filename的linenum行停住;
(5)b filename:function:在源文件filename的function函数的入口处停住;
(6)b *address:在程序运行的内存地址处停住;
(7)b:没有参数时,表示在下一条指令处停住;
(8)b…if< condition >:…可以是上述的< linenum >,+offset / b -offset等参数,condition表示条件,在条件成立时停住,如break if i=100,表示当i=100时停住;
查看断点使用info命令。单步命令
next命令用于单步执行,但不进入函数内部,简写为n;step命令在单步执行一个函数时,进入函数内部,简写为s。
(1)s < count >:单步跟踪,如果有函数调用,则进入该函数。count表示执行后面的count条指令然后停住;
(2)n < count >:单步跟踪,如果有函数调用,不进入该函数。count表示执行后面的count条指令然后停住;
(3)set step-mode:set step-mode on用于打开step-mode模式,在进行单步跟踪时,若跨越某没有调试信息的函数,程序的执行则会在该函数的第一条指令处停住,而不会跳过整个函数。这样我们可以查看该函数的机器指令;
(4)finish:简写为fin。表示运行程序直到当前函数完成返回,并打印函数返回时的堆栈地址、返回值及参数值等信息;
(5)until:简写为u。运行程序直到退出循环体;continue命令
简写为c。表示当程序被停住后,可以使用c命令回复程序的运行直到程序结束,或者到达下一个断点。
print命令
简写为p。当程序被停住时,可使用p命令查看当前程序的运行数据,其格式为:
p < expr >
p /< f > < expr >
其中:
< expr >是变量或表达式。比如p sum表示查看变量sum的值,如果sum是静态数组名,则表示查看数组的元素值,p *array@100表示查看动态数组的值,array表示起始地址,100表示长度;
< f >是输出的格式。支持的格式有:
(1)x:十六进制;
(2)d:十进制;
(3)u:十六进制格式显示无符号整型;
(4)o:八进制;
(5)t:二进制;
(6)c:字符格式;
(7) f:浮点格式。watch命令
watch命令一般用来观察某个表达式的值是否有了变化,如果有变化则马上停止程序的运行。使用方法如下:
(1)watch < expr >:当表达式expr被读时停止程序运行;
(2)awatch < expr >:当表达式的值被读或者被写时停止程序运行;
(3)info watchpoints:列出当前所设置的所有观察点。examine命令
简写为x。表示查看内存地址的值。其用法如下:
x /< n/f/u > < addr >
其中:
< addr >:内存地址;
n:一个正整数,表示显示内存的长度;
f:表示显示的格式,如果地址所指定的是字符串,那么格式可以是s;
u:表示从当前地址往后请求的字节数,不指定默认是4字节。b表示单字节,h表示双字节,w表示四字节,g表示八字节。
例如:x /3uh 0x54320表示从内存地址0x54320开始以及双字节(h)为一个单位、16进制方式(u)显示3个单位(3)的内存。signal命令
使用signal命令可以产生一个信号量给被调试的程序。可以在程序运行的任意位置处设置断点,并在该断点处用GDB产生一个信号量,这种精确地在某处产生信号的方法非常有利于程序的调试。其格式为
signal < signal >
其中
< signal >:信号量,一般为1~15;disassemble命令
disassemble命令用于反汇编,可用它来查看当前执行时的源代码的机器码,实际上只是把当前内存中的指令冲刷出来。