Linux:GDB基本调试命令

gdb 文件名

1、基本指令:

help     //帮助
i         //info,查看一些信息,只输入info可以看可以接什么参数,下面几个比较常用
    i b     //常用,info break 查看所有断点信息(编号、断点位置)
    i r     //常用,info registers 查看各个寄存器当前的值
    i f     //info function 查看所有函数名,需保留符号
i $esp    //查看esp寄存器
dereference $esp       //gef
show     //和info类似,但是查看调试器的基本信息
    show args         //查看参数
rdi     +寄存器名代表一个寄存器内的值,用在地址上直接相当与一个十六进制变量
backtrace     //查看调用栈
q         //quit 退出

2、执行指令:

s     //单步步入,遇到调用跟进函数中,相当于step into,源码层面的一步
    si     //常用,同s,汇编层面的一步
n     //单步补过,遇到电泳不跟进,相当于step over,源码层面的一步
    ni     //常用,同n,汇编层面的一步
c     //continue,常用,继续执行到断点,没断点就一直执行下去
r     //run,常用,重新开始执行
k    //终止正在调试的程序
st    //开始执行程序,在main函数的第一条语句前面停下来

3、断点指令:

下普通断点指令b(break):
b *(0x123456)         //常用,给0x123456地址处的指令下断点
        b *$ rebase(0x123456)     //$rebase 在调试开PIE的程序的时候可以直接加上程序的随机地址
b [函数名]         //常用,给函数下断点,目标文件要保留符号才行
        b 文件名:函数名
b [文件名]:15         //给文件的15行下断点,要有源码
        b 15
b +0x10     //在程序当前停住的位置下0x10的位置下断点,同样可以-0x10,就是前0x10
b [] if $rdi==5         //条件断点,rdi值为5的时候才断

4、删除、禁用断点:

i b                //查看断点编号
delete 3        //常用,删除3号断点,直接delete不接数字删除所有
disable 3        //常用,禁用3号断点
       enable 3     //启用3号断点
clear     //清除一个断点

5、内存断点指令watch:

watch 0x123456     //0x123456地址的数据改变的时候会断
watch a         //变量a改变的时候会断
info watchpoints     //查看watch断点信息

6、捕获断点catch:

catch syscall     //syscall系统调用的时候断住
tcatch syscall     //syscall系统调用的时候断住,只断一次
info break         //catch的断点可以通过i b查看

7、查看栈帧:

f
f n         //查看第n桢的信息
f addr         //查看pc地址为addr的桢的相关信息
up n         //查看当前桢上面第n桢的信息
down n         //查看当前桢下面第n桢的信息
bt            //查看看函数调用信息(堆栈)

8、查看内存指令x:

x /nuf 0x123456     //常用,x指令的格式是:x空格/nfu,nfu代表三个参数
        n    代表显示几个单元(而不是显示几个字节,后面的u表示一个单元多少个字节),放在’/'后面
        u    代表一个单元几个字节,b(一个字节),h(两字节),w(四字节),g(八字节)
        f    代表显示数据的格式,f和u的顺序可以互换,也可以只有一个或者不带n,用的时候很灵活
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十六进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
c 按字符格式显示变量。
f 按浮点数格式显示变量。
s 按字符串显示。
b 按字符显示。
i 显示汇编指令。

x /10gx 0x123456         //常用,从0x123456开始每个单元八个字节,十六进制显示是个单元的数据
x /32gx,x /4gx,x /8gx,x /16gx
x /10wx 0x123456         //常用,从0x123456开始每个单元四个字节,十六进制显示是个单元的数据
x /32wx,x /4wx,x /8wx,x /16wx
x /10xd $rdi             //从rdi指向的地址向后打印10个单元,每个单元4字节的十进制数
x /10i 0x123456         //常用,从0x123456处向后显示十条汇编指令
x /10xd $rsp
x /20wx $esp
x /3uh 0x54320         //表示从内存地址0x54320读取内容,h表示以双字节为一个单位,3表示输出三个单位,u表示按无符号十进制显示。
x $pc                //显示程序指针指向位置的内容。
x /i $pc            //显示程序当前位置的汇编指令。
x /10i $pc            //显示程序当前位置开始往后的10条汇编指令。
disassem $pc        //反汇编当前函数。简写为:disas $pc

9、打印指令p(print):

p fun_name             //打印函数的地址,需要保留符号
p 0x10-0x08         //计算0x10-0x08的结果
p &a                 //查看变量a的地址
p a                    //查看变量a的值
p *array@len        //动态数组,@的左边是第一个内存的地址的值,@的右边你想查看内存的长度
p *(0x123456)         //查看0x123456地址的值,注意和x指令的区别,x指令查看地址的值不用星号
p $rdi                 //显示rdi寄存器的值,注意和x的区别,这只是显示rdi的值,而不是rdi指向的值
        p *($rdi)     //显示rdi指向的值
p/c $eax            //用字符显示eax寄存器内容

10、打印汇编指令disass(disassemble):

disass 0x123456                 //显示0x123456前后的汇编指令
disas [fun_name or filename]
disass [fun_name or filename]     //pwngdb
x /10i                             //显示程序当前位置开始往后的10条汇编指令。

objdump -d ctarget > ctarget-disassemble    //反汇编全部代码并重定向输出

具体请参考 disassemble

11、打印源代码指令list:

list //查看当前附近10行代码,要有源码。
        list 18         //查看18行附近10行代码
        list 1,10         //查看1-10行
        list main         //查看main函数开始10行

12、修改数据指令set:

set $rdi=0x10                 //把rdi寄存器的值变为0x10
set *(0x123456)=0x10         //0x123456地址的值变为0x10,注意带星号
set args 'abc' 'def' 'gh'     //给参数123赋值
       set args "python -c 'print "1234\x7f\xde" ' " //使用python给参数赋值不可见字符

13、查找数据:

search rdi             //从当前位置向后查包含rdi的指令,返回若干
        search -h     //查看search帮助
find "hello"         //查找hello字符串,pwndbg独有

14、扩展

1)假设我们希望程序断住时,就显示某个变量的值,可以使用display命令。

(gdb) display e
1: e = 8.5

2)图形化调试界面

layout src:显示源代码窗口
layout asm命令显示汇编代码窗口
如果既想显示源代码,又想显示汇编代码,可以使用layout split命令

猜你喜欢

转载自blog.csdn.net/hhd1988/article/details/128635672