目录
1. list 命令
- list命令可以所写为l,可以列出所调试程序的代码(前提是代码与可执行程序在同一服务器上),其居具体使用方法如下:
- list+lineNumber,打印指定行附近的代码。如list 45,gdb会将45行前后的代码打印在屏幕上。
- 直接输入list,gbd会将gdb当前所处的行以及后面的代码打印在屏幕上。
- 输入list -,gbd会将gdb当前所处的行前面的代码打印在屏幕上。
- list+functionName,打印名称为functionName的函数的上下文的代码。
2. run 命令
在gdb中使用run(可以缩写为r)命令运行程序,一般启动进程后会配合set args设置进程入参。如set args 10 20,相当于把args设置为3,argv[1]为10,argv[2]为20。
show args可以查看运行时参数。
3. quit命令
在gdb中使用quit(可以缩写为q)命令退出正在运行的程序。
4. break命令
在使用gdb调试时使用break(可以缩写为b)命令来设置断点,有如下几种方法:
- break < function >
在进入指定的函数function时既停止运行,C++中可以使用class::function或function(type, type)格式来指定函数名称- break < lineNumber>
在指定的代码行打断点- break +offset/break -offset
在当前行的前面或后面的offset行打断点,offset为自然数- break filename:lineNumber
在名称为filename的文件中的第lineNumber行打断点- break filename:function
在名称为filename的文件中的function函数入口处打断点- break *address
在程序运行的内存地址处打断点- break
在下一条命令处停止运行- break … if < condition>
在处理某些循环体中可使用此方法进行调试,其中…可以是上述的break lineNumber、break +offset/break -offset中的参数,其中condition表示条件,在条件成立时程序即停止运行,如设置break if i=100表示当i为100时程序停止运行。
查看断点时,也可以使用info命令如info breakpoints [n]、info break [n]其中n 表示断点号来查看断点信息。
5. delete命令
delete命令可以用来删除断点。其中:
- delete breakpoints删除所有断点。
- delete breakpoints n,删除编号为n的断点,n是info breakpoints得到的。
disable breakpoints命令可以禁用断点,enable breakpoints可以启用断点。
6. 逐步调试
使用gdb工具调试可以使用next命令单步执行程序代码,next的单步不会进入函数的内部,与next对应的step命令则在单步执行一个函数时进入函数内部,类似于VC++中的step into.其用法如下:
6.1 next <count>
单步跟踪,如果有函数调用不会进入函数,如果后面不加count表示一条一条的执行,加count表示执行后面的count条指令。
6.2 step < count>
单步跟踪,如果有函数调用则进入该函数(进入该函数前提是此函数编译有Debug信息),与next类似,其不加count表示一条一条执行,加上count表示自当前行开始执行count条代码指令。
6.3 set step-mode
set step-mode on用于打开step-mode模式,这样在进行单步跟踪时,程序不会因为没有debug信息而不停止运行,这很有利于查看机器码,可以通过set step-mode off关闭step-mode模式
6.4 call
call name 调用和执行一个函数。
6.5 finish
运行程序直到当前函数完成并打印函数返回时的堆栈地址和返回值及参数值等信息。
6.6 until
运行程序直到退出循环体
6.7 disassemble
简写为disas,查看当前函数的汇编指令,并显示下一条要执行的执令。
6.8 stepi(缩写si)和nexti(缩写ni)
stepi和nexti用于单步跟踪一条及其指令,一条程序代码有可能由数条机器指令完成,stepi和nexi可以单步执行机器指令。
7. contine命令
当程序遇到断点停止运行后可以使用continue(缩写为c)命令恢复程序的运行到下一个断点或直到程序结束。
8. print命令
print可以缩写为p,可以通过print命令查看参数或程序运行数据,print是可以指定输出内容格式的,具体方法如下:
- x按16进制格式显示变量
- d按十进制显示变量
- u按十六进制格式显示无符号整形
- o按八进制格式显示变量
- t按二进制格式显示变量
- c按字符格式显示变量
- f按浮点数格式显示变量
可以使用display命令设置一些自动显示的变量,当程序暂停运行或单步跟踪时,这些变量会自动显示。
如果要修改变量的值也可以使用print命令如:print g_top = 24。
使用print查看程序运行时的数据时,每一个print都会被gdb记录下来并且以 (美元符号)1、(美元符号)2…这样的方式为每一个print命令编号,我们可以使用这个编号来访问以前的表达式,如print $1会打印出第一次打印的表达式的值。
9.set命令
set para=value,可以给变量赋值。
10. watch命令
watch命令一般来观察某个表达式(变量也可视为一种表达式)的值是否发生了变化,如果由变化则程序立即停止运行,其具体用法如下:
- watch < expr>
为表达式(变量)expr设置一个观察点一旦其数值由变化,程序立即停止运行- rwatch < expr>
当表达式expr被读时,程序立即停止运行- awatch < expr>
当表达式expr的值被读或被写时程序立即停止运行- info watchpoints
列出当前所设置的所有观察点
11. return命令
如果在函数中设置了调试断点,在断点后还有语句没有执行完,这个时候我们可以使用return命令强制函数忽略还没有执行的语句并返回。可以直接使用return命令用于取消当前函数的执行并立即返回函数值,也可以指定表达式如 return < expression>那么该表达式的值会被作为函数的返回值。
12. info命令
info命令可以用来在调试时查看寄存器、断点、观察点和信号等信息。其用法如下:
- info registers:查看除了浮点寄存器以外的寄存器。
- info all-registers: 查看所有的寄存器包括浮点寄存器。
- info registers < registersName>:查看指定寄存器。
- info break: 查看所有断点信息。
- info watchpoints: 查看当前设置的所有观察点。
- info signals info handle: 查看有哪些信号正在被gdb检测。
- info line: 查看源代码在内存中的地址。
- info threads: 可以查看多线程。
13. bt命令
bt命令的作用书打印程序的堆栈,gdb调试过程中输入bt可以清晰的看到函数的调用路径。where命令也有相同的作用。
14. whatis和ptype 命令
这两个命令可以显示变量的类型,ptype比whatis的功能更强,他可以提供一个结构的定义。
15. 回车符
gdb在执行完一个命令后不输入任何命令直接回车,gdb会默认执行上一个命令。
16. help命令
进入gdb后可以使用help命令查看gdb的使用方法。
17. start命令
开始调试,停在第一行代码处。
18. handle命令
gdb通常可以捕捉到发送给它的大多数信号,通过捕捉信号,它就可决定对于正在运行的进程要做些什么工作。例如,按CTRL-C将中断信号发送给gdb,通常就会终止gdb。但是你或许不想中断gdb,真正的目的是要中断gdb正在运行的程序,因此,gdb要抓住该信号并停止它正在运行的程序,这样就可以执行某些调试操作。
handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:
- nostop 接收到信号时,不要将它发送给程序,也不要停止程序。
- stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)
- print 接受到信号时显示一条消息
- noprint 接受到信号时不要显示消息(而且隐含着不停止程序运行)
- pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
- nopass 停止程序运行,但不要将信号发送给程序。
例如,假定你截获SIGPIPE信号,以防止正在调试的程序接受到该信号,而且只要该信号一到达,就要求该程序停止,并通知你。要完成这一任务,可利用如下命令:
(gdb) handle SIGPIPE stop print
请注意,UNⅨ的信号名总是采用大写字母!你可以用信号编号替代信号名如果你的程序要执行任何信号处理操作,就需要能够测试其信号处理程序,为此,就需要一种能将信号发送给程序的简便方法,这就是signal命令的任务。该命令的参数是一个数字或者一个名字,如SIGINT。假定你的程序已将一个专用的SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,要想测试该信号处理程序,你可以设置一个断点并使用如下命令:
(gdb) signal 2
continuing with signal SIGINT⑵
该程序继续执行,但是立即传输该信号,而且处理程序开始运行。