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不进入调用函数
finishfin,完成一个函数
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使用文件中的断点










