shell shell-command
pipe p var command| wc
管道用法
gdb a.out
即可进入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
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只在有的时候是有意义的,有的时候找不到这玩意tbreak args
只会暂停一次rbreak regex
info b
,info break
,info b 1
,显示第1个断点信息
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:
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
使用文件中的断点
skip file filename
当使用step时
skip functionname
跳过函数
backtrace or bt
,显示栈栈帧,不会显示局部变量bt -full
,显示栈帧,也显示局部变量bt n
,bt -n
一个显示最内部的n个帧,一个显示最外部的n个帧frame,f
f [level] num
,选择编号为num的帧,level可以省略up
,显示一下个帧down
,显示上一个帧f function functioname
,显示该函数的栈帧info args
输出当前栈帧的调用参数info frame or info f
输出当前栈帧信息,后面可以跟某一栈帧info local or info locals
显示栈帧的局部变量info args [-q] [-t type_regexp] [regexp]
,两个正则表达式,一个筛类型,一个筛名称。frame apply [all | count | -count | level level...] [option]... command
,在栈帧上执行命令faas command
, frame apply all -s command
的缩写disassemble
disas \m functionname
print,p
p val
显示变量的值 p &val
显示变量地址 p *(&val)
显示变量(套娃写法)
类printf式输出 例 p /x val
,输出16进制,
p arr
,在输出数组时,如果大小已经知晓,它能输出整个数组元素。examine,x
默认是以\x读取,用法类p
x /nfu
,n表示长度,f表示format,u表示unit size(b(1byte),h(2byte),w(4byte),g(8byte))
,注意 i属于f表示反编译
x /4xg 0x7fffffffd8cc
读取4个字节并以16进制显示,
x /4i $pc
反编译当前指令4条
$_,$__
上一次x执行的结束地址,上上次的结束地址
display
display /fmt expr
,第次停下来都可以输出该表达式,/fmt表示格式
display /i $pc
显示下一条要执行的指令
delete display id
删除某条display
disable or enable display id
允许或禁用某条显示
info display
查看有的自动化输出条目
whatis valname
print b=4
在用print显示变量的时候可以给它赋个值set [var] varname
一般可以不写var,但有的时候有歧义则一定要带上varjump,j
j location
直接跳转到某一行set $pc=0x34ad
直接修改寄存器的值也是ok的return
不给返回值return expr
给一个返回值p expr
expr可以包含函数调用,函数是属于被调试程序的
call function(args..)
直接调用一个函数
if 语法
define adder
if $argc == 2
print $arg0 + $arg1
end
if $argc == 3
print $arg0 + $arg1 + $arg2
end
end
while 语法
loop_break,loop_continue
与c里的break,continue同一功能
define adder
set $i = 0
set $sum = 0
while $i < $argc
eval "set $sum = $sum + $arg%d", $i
set $i = $i + 1
end
print $sum
end
hook ,会在funcname执行前先执行,对名称有固定要求
define hook-funcname
stats
end
执行一个文件中的gdb命令
source [-s] [-v] file
//-s表示在path中找文件
//-v会打印每一条执行的命信 verbose