GDB 技巧
打印下一条要执行的汇编代码
(gdb) set disassemble-next-line on
n 和 ni
(gdb) n
(gdb) ni
n 是执行下一条 C 语言代码
ni 是执行下一条汇编指令
反汇编
(gdb) disassemble main
(gdb) disassemble add
反汇编某个函数
在函数入口打断点
(gdb) b *main
or
(gdb) b main
删除断点
删除某个断点
(gdb) delete 7
删除所有断点
(gdb) delete
在汇编语句上打断点
(gdb) disassemble main
Dump of assembler code for function main:
0x0000000000001149 <+0>: endbr64
0x000000000000114d <+4>: push rbp
0x000000000000114e <+5>: mov rbp,rsp
0x0000000000001151 <+8>: sub rsp,0x10
0x0000000000001155 <+12>: mov DWORD PTR [rbp-0x4],edi
0x0000000000001158 <+15>: mov QWORD PTR [rbp-0x10],rsi
0x000000000000115c <+19>: lea rdi,[rip+0xea1] # 0x2004
0x0000000000001163 <+26>: call 0x1050 <puts@plt>
0x0000000000001168 <+31>: mov eax,0x0
0x000000000000116d <+36>: leave
0x000000000000116e <+37>: ret
End of assembler dump.
(gdb) b *main+4
显示寄存器的值
(gdb) info reg // 显示所有寄存器
(gdb) info reg rbp // 显示 rbp 寄存器
查看内存数据
格式:x /nfu
x 是 examine 的缩写,意思是检查
n 表示要显示的内存单元的个数
f 表示显示方式,,可取如下值:
x 按十六进制格式显示变量。
d 按十进制格式显示变量。
u 按十进制格式显示无符号整型。
o 按八进制格式显示变量。
t 按二进制格式显示变量。
a 按十六进制格式显示变量。
i 指令地址格式
c 按字符格式显示变量。
f 按浮点数格式显示变量。
u 表示一个地址单元的长度:
b表示单字节,
h表示双字节,
w表示四字节,
g表示八字节
示例
(gdb) x /8xb 0x7fffffffdca8
0x7fffffffdca8: 0x89 0x51 0x55 0x55 0x55 0x55 0x00 0x00
(gdb) x /8xh 0x7fffffffdca8
0x7fffffffdca8: 0x5189 0x5555 0x5555 0x0000 0xddc8 0xffff 0x7fff 0x0000
(gdb) x /1xw 0x7fffffffdccc
0x7fffffffdccc: 0x00000008
(gdb) x /1xg 0x7fffffffdca8
0x7fffffffdca8: 0x0000555555555189
图形化调试
(gdb) wh
退出图形化调试
ctl+x+a
运行 shell 命令
(gdb) shell ls
hello.asm hello.c hello.out
打印变量值
格式:p 变量名
(gdb) run
Starting program: /home/liyongjun/project/c/C_study/asm/hello3/hello.out 13
Breakpoint 20, add (a=3, b=5) at hello.c:7
7 c = a + b;
(gdb) p c
$1 = 21845
打印变量地址
格式:p &变量名
(gdb) p &c
$2 = (int *) 0x7fffffffdc8c
监控变量
格式:watch 变量名
(gdb) watch c
Hardware watchpoint 25: c
(gdb) c
Continuing.
Hardware watchpoint 25: c
Old value = 21845
New value = 8
add (a=3, b=5) at hello.c:9
9 return c;
(gdb)
监控内存地址
格式:watch *地址
(gdb) p c
$1 = 21845
(gdb) p &c
$2 = (int *) 0x7fffffffdc8c
(gdb) watch *0x7fffffffdc8c
Hardware watchpoint 21: *0x7fffffffdc8c
(gdb) n
Hardware watchpoint 21: *0x7fffffffdc8c
Old value = 21845
New value = 8
add (a=3, b=5) at hello.c:9
9 return c;
(gdb)
显示接下来的 10 条指令
(gdb) x /10i $pc
=> 0x555555555157 <add+14>: mov edx,DWORD PTR [rbp-0x14]
0x55555555515a <add+17>: mov eax,DWORD PTR [rbp-0x18]
0x55555555515d <add+20>: add eax,edx
0x55555555515f <add+22>: mov DWORD PTR [rbp-0x4],eax
0x555555555162 <add+25>: mov eax,DWORD PTR [rbp-0x4]
0x555555555165 <add+28>: pop rbp
0x555555555166 <add+29>: ret
0x555555555167 <main>: endbr64
0x55555555516b <main+4>: push rbp
0x55555555516c <main+5>: mov rbp,rsp