打印下一条要执行的汇编代码

(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

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