GDB调试命令总结

本文介绍Linux下GDB调试器常用的基本命令,方便平时查询,目前可能不完善,日后发现新命令再添加。

1.源代码编译

gcc -g target.c -o target

这里面一个必要的步骤是:GCC的-g选项:让编译器将符号表(对应于程序的变量和代码行的内存地址列表)保存在生成的可执行文件中。这样才能在调试会话过程中引用源代码中的变量名和行号。

2.基本GDB命令

启动GDB:gdb exeFileName

gdb中中文显示是乱码,暂时还不知道怎么支持中文。

TUI模式运行GDB:gdb -tui exeFileName

在调用gdb的时候指定-tui选项或者在处于非TUI模式时在GDB中使用Ctrl+X+A组合键,可以将终端屏幕分成原文本窗口和控制台的多个子窗口。

退出GDB:quit或者Ctrl+d

再次执行上次命令:Enter

执行程序:run

开始执行程序:start

该命令会停在main函数第一行语句前面等待命令

查看栈帧:frame num(栈帧编号)

注意栈帧编号规则,当前正在执行的函数的帧被编号为0,其父帧(即该函数的调用者的栈帧)被编号为1,父帧的父帧被编号为2,以此类推。

跳到调用栈中的下一个父帧:up

引向相反方向:down

显示整个栈:backtrace

滚动查看代码:↑等箭头键

浏览以前的GDB命令:上一个Ctrl+P、下一个Ctrl+N

3.设置普通断点

在某一行设置断点:break line_number(行数)
在源文件某行设置断点:break filename:line_number(filename是文件名,line_number是行数)
在函数的入口处设置断点:break function(函数名)
这种方法相对以行数设置断点有一个优点:如果修改了源代码,使得函数不再在这一行处开始,那么如果用函数名指定断点,而不是用行号指定,则断点仍然有效。注意:break function会在所有具有相同名称的函数上设置断点,注意函数重载的情况。
在源文件某函数设置断点:break filename: function(filename是文件名,function是函数名)

4.设置条件断点

普通断点转条件断点:condition b_num(断点编号) cond(条件)
在有效的C条件语句中几乎可以用任何表达式。也可以用自己的函数或者库函数,只要他们被链接到程序中。
如:condition 1 num_y == 1
只有当满足条件num_y == 1时,GDB才会在断点1处暂停程序的执行。
如果以后要删除条件,但是保持断点,只需键入:cond b_num(断点编号)
直接设置条件断点:break line_num(行号) if cond(条件)
例子:(gdb) break 30 if num_y == 1
注意,条件语句可以用括号()括起来,也可以不用。
临时断点:tbreak
与break类似,但是这一命令设置的断点在首次到达该指定行后就不再有效。

5.删除断点

基于编号删除断点:delete
delete b_num(断点编号),可以在后面指定多个断点编号连续删除几个断点
delete:删除所有断点
基于位置删除断点:clear
依据位置删除断点,工作方式和对应的break命令相似:
clear function
clear filename:funtion
clear line_number
clear filename:line_number
clear:清除GDB将执行的下一个指令处的断点

6.启用与禁用断点

禁用断点:disable breakpoint-list(是用空格分隔开的多个断点标识符)
禁用所有现存断点:disable
启用断点:enable breakpoint-list
在下次引起GDB暂停执行后禁用:enable once breakpoint-list
查看所有断点信息:info break或者是info breakpoints或者简写为i b

7.断点命令列表

让GDB在每次到达某个断点时自动执行一组命令,从而自动完成某一任务。
使用commands命令设置命令列表:
commands b_num
...
commands
...
end

8.恢复执行

单步执行:step(s)、next(n)
仅执行到代码的下一行后再次暂停。
注意二者区别:在函数调用时step会进入函数,next导致下一次暂停出现在调用函数之后。next被称为单步越过(stepping over)函数,而step被称为单步进入(stepping into)函数。
next和step都可以采用一个可选的数值参数,来表示要使用next或step执行的额外行数。
无条件恢复程序的执行:continue(c)
直到遇到另一个断点或者程序结束。
continue可以接受一个可选的数值参数n,要求GDB忽略下面n个断点。
其他命令恢复:finish(fin)或until(u)
finish命令指示GDB恢复执行,直到恰好在当前帧完成之后为止。
until命令通常用来在不进一步在循环中暂停(除了循环中的中间断点)的情况下完成正在执行的循环。until会执行循环的其余部分(如果遇到断点,还是会暂停),让GDB在循环后面的第一行代码处暂停。
until命令也可以接受源代码中的位置作为参数,其用法与break命令同。

9.监视点

设置监视点:watch z(变量名)或复杂的表达式
监视点是一种特殊类型的断点,区别在于监视点没有“住在”某一行源代码中,而是指示GDB每当某个表达式改变了值就暂停执行。
只能监视存在且在作用域内的变量。一旦变量不再存在调用栈的任何帧中,GDB会自动删除监视点。
GDB实际上是在变量的内存位置改变值时中断。

10.文件清单

查看源代码只显示10行
list lineNum 在lineNum的前后源代码显示出来
list + 列出当前行的后面代码行
list - 列出当前行的前面代码行
list first,last 显示从first到last的源代码行
list function
set listsize count
 设置显示代码的行数
show listsize 显示打印代码的行数

11.变量监视

输出当前值:print(p) variable
print 是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容:
a.对程序中函数的调用 例如:print function(1,0)
b.数据结构和其他复杂对象 例如:print variable
c.动态数组 例如:print array@length
修改变量的值:set variable = value
显示某个变量的类型:whatis variable
跟踪查看某个变量:display variable
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值