gdb的使用教程
在gdb下使用shell命令的方法
shell shell-command
pipe p var command| wc
管道用法
进入gdb
- 调试可执行文件
gcc 编译的时候最好带上-g指令,这样调试器能获得很多信息,gdb a.out
即可进入gdb界面 - 调试进程
gdb调试运行着的进程gdb program process-id ,gdb -p process-id
均可
detach attach
是可用来调试进程
给调试程序设置命令行参数
set args str str
给程序设定参数
show args
显示参数
修改程序用到的环境变量
set enviroment varname=val
show enviroment varname
修改程序的执行路径
- 内部程序工作目录
set cwd=path
show cwd
没设的话默认继承gdb的执行路径 - gdb工作目录
cd pwd
是可用命令
快照回退
保存某个程序状态,方便回退到这个状态而不用再次启动程序
-
保存快照
checkpoint
-
显示所有快照
info checkpoints
-
删除快照
delete checkpoint id
-
快照回退
restart id
一般而言是形如restart 3
这样的,取process前面的数字哟
显示源代码
-
layout src
显示c代码 -
layout asm
显示程序的反汇编代码 -
在这里插入图片描述
启动命令
start
:跑到main函数
starti
:跑到程序第一条指令
run or r
: 直接跑到遇到断点为止
continue or c
:从断点开始,直到下一个断点暂停
n
:下一行代码
ni
:下一条指令
c [ignore_count]
执行并忽略几次断点
step
走源代码的一行,它和next
的区别在于next不进入调用函数
finish
fin,完成一个函数
until line
走到某一行才停
advance line
走到某一行才停,不要求在同一个栈帧里
si,ni
走过一条指令,区别在于ni不进入函数
打断点
断点类型
- 条件断点
例如b 10 if val==3
,如果变量val==3才会暂停,要在line 10处,val必须存在。-force-condition 可要求val只在有的时候是有意义的,有的时候找不到这玩意 - 临时断点(temp break),
tbreak args
只会暂停一次 - 正则断点,顾名思议,用正则表达式匹配停止的函数
rbreak regex
显示断点信息
info b
,info break
,info b 1
,显示第1个断点信息
- 编号
- 类型,breakpoints,watchpoints,catchpoints
- disposition ,keep保持,delete删除,
- enb(enable),y能用,n不生效
- address 地址,为断点在的内存位置,当不知道内存位置时,显示pending
- what 告诉我们这断点在哪个文件的哪一行,如暂不知,显示名字
下图中的test是瞎编的,永远找不到这个函数在哪
- 在c文件指定地方打断点
layout src,b location
,location指的是c代码的行数
b +offset
或b -offset
相对当前伴置偏移几行打断点
b filename:linenumber
当有多个文件时,需在前面说明文件名
b
默认为当前位置的下一条指令
观测型断点
主要是监测一个值是否发生了变化(写入,读取,值改变),如果发生了变化,停在使它变化的地方,一般使用ide所用到的断点都是上面那种断点,在某个地方打一个断点排错,基本上也够用了,不过了解这种断点会在少数情况下带来方便,比如不知道哪个人的代码改了你的全局变量的时候,或者数据被覆盖的时候。
值改变检测
- 观测局部变量
watch localval
,要求当该局部变量的函数被进入时,对全局变量则没有限制 - 观测表达式,可由局部变量,全局变量组成,当表达式有变化时,停住
watch expr
.例watch c*3
.
读入检测
rwatch args
读写检测awatch args
当读或写时都会触发,写时值不改变也会触发
删除断点
clear
删除当前断点
clear location
删除某一特定断点
delete id
删除info b
里num=id的断点
指定断点状态
enable/diable [breakpoints] [type] [id...]
disable breakpoints
禁用所有断点
enabel breakpoints id1 id2 id3...
breakpoints可以不写,使能断点
disable id1 id2 id3
禁用某些断点
type:
- once 只停一次并禁用
- count cnt 只用cnt次并禁用
- delete 用一次就删
可编程断点
b 7 if c==3
,回车
commands
silent
p c
end
定点输出
dprintf location,template,expression[,expression...]
dprintf 3,"%d %d %d",a,c,b
可以指定printf函数
断点保存
save breakpoints file
存储断点
source file
使用文件中的断点