gdb常用指令

gdb

<a>表示a内容必须写

[a]表示a内容可写可不写

{a}表示a给出的选择必须选一个

1.gdb启动

# 可执行程序不需要参数
gdb ./program
gdb program core
gdb program pid #指定进程运行的pid,比如1234

2.程序运行/调试

#2.1程序运行参数
set args #指定运行参数,如set args 10 20
show args #展示运行参数
​
​
#2.2程序运行
run [args] #args可有可不有,一直运行断点位置 (r)
continue   #运行到下一个断点位置 (c)
next #单步,但不进入函数内部
step #单步,进入函数内部
finish #退出函数
until #退出循环体
​
#2.3工作目录
cd #相当于shell的cd命令
pwd #显示当前的所在目录
​
​
#2.4程序输入输出
run > <输出文件>
​
​

3.断点

#断点 break (b)
#functionname也可以使用function(type,type)格式来指定函数名
​
## 设置断点
b 10 #在源程序第10行断点
b func  #在func入口断点
b <namespacename>::<classname>::<functionname>  #在进入指定类名空间的指定类的指定函数停住
b <filename>:<linenum> #在进入指定文件的第linenum行停住
b <filename>:<functionname>
​
## 查询断点
info break
​
​
## 条件断点
b test.c:8 if intValue == 5  #当intvalue==5时,暂停
condition bnum expression   #当expreession成立,点号bnum暂停
Ignore bnum count       #忽略断点号为bnum的停止条件count次
​
## 删除断点
clear #删除所有断点
clear <linenum> #除所有设置在指定行上的停止点。
clear <functionname> #删除所有设置在funtionname上的断点
clear <filename>:<linenum> #清除所有设置在指定文件:指定行上的停止点。
​
delete [breakpoints] [range...] #删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7),其简写命令为d
disable [breakpoints] [range...]#disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.
enable [breakpoints] [range...] #enable所指定的停止点,breakpoints为停止点号。
enable [breakpoints] once range…#enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。
enable [breakpoints] delete range#enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。
​
## 为断点设置自动化调试
commands [bnum]
​
… command-list …
​
end
​
eg:
break foo if x>0
commands
printf “x is %d “,x
continue
end
​
​

4.观察点

#设置观察点
watch <expression> #当表达式值有变化时,马上停住程序。
rwatch <expression> #表达式(变量)expr被读时,停住程序
awatch <expression> # 表达式(变量)的值被读或被写时,停住程序
​
##展示观察点
info watchpoint

5.显示

#打印当前值
print(p)    #打印变量、字符串、表达式等的值,可简写为p 
​
​
​
#变量
#1、全局变量(所有文件可见的)
#2、静态全局变量(当前文件可见的)
#3、局部变量(当前Scope可见的)
#如果你的局部变量和全局变量发生冲突(也就是重名),一般情况下是局部变量会隐藏全局变量
#如果此时你想查看全局变量的值时,你可以使用“::”操作符
#数组变量
p *array@len
#有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用GDB的“@”操作符,“@”的左边是第一个内存的地址的值,“@”的右边则你你想查看内存的长度
​
​
​
#自动显示
## 设置自动显示
display expr
display/fmt expr   #eg:display/d expr
display/fmt addr
​
#删除自动显示
undisplay dnums
delete display dnums
​
#启动或失效自动显示
disable display dnums
enable display dnums
​
# 查看自动显示的信息
info display
​
​
​
#历史记录
show values #print最后十个记录
show values n #print n 附近的10个记录
show values + #print 上一次print value 后的10个记录
​
​
​
#查看源代码
list <linenum>
list <functionname>
list #展示当前行后的源程序
set listsize count#设置一次显示源代码的行数

6.改变程序执行

# 修改变量值
print x=5
set var x=7
​
#跳转执行
jump linespec #指定下一条语句的运行点。可以是文件的行号,可以是file:line格式,可以是+num这种偏移量格式。表示下一条运行语句从哪里开始
jump *address #这里的是代码行的内存地址
​
#产生信号量
signal signal
​
#强制函数返回
return
return expr #使用return命令取消当前函数的执行,并立即返回,如果指定了,那么该表达式的值(expr)会被认作函数的返回值
​
## 强制调用函数
call expr
​

7.线程

# 设置断点
break linespec thread threadno
break linespec thread threadno if condition
#linespec指定了断点设置在的源程序的行号threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定‘thread threadno ’则表示你的断点设在所有线程上面
​
​
#查看栈信息
breacktrace #快捷命令,bt
bt n #打印栈顶上n层的栈信息
bt -n #打印栈底下n层的栈信息
frame n#查看当前 n层的栈信息
​
up n #表示向栈的上面移动n层,可以不打n,表示向上移动一层。
down n #表示向栈的下面移动n层,可以不打n,表示向下移动一层。
eg:
frame 3
up 2
frame   #此时打印第五层信息
​
#信号
handle signal [keywords...]
# keywords列表如下:
nostop  #当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。
stop    #当被调试的程序收到信号时,GDB会停住你的程序。This implies the print keyword as well.
print   #当被调试的程序收到信号时,GDB会显示出一条信息。
noprint #当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。This implies the nostop keyword as well.
pass
noignore    #当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序处理 or else it may terminate if the signal is fatal and not handled.
nopass
ignore#当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值