GDB 常用命令
断点
(gdb) break test.c:8 // 设置行号断点
(gdb) break func_name // 设置函数断点
(gdb) break *0x40106e // 设置汇编16进制行号断点
(gdb) info b // 查看断点
(gdb) ignore 2 5 // 跳过断点 第一个参数表示断点编号,第二个表示跳过次数。
调试
- n
执行一行源程序代码,此行代码中的函数调用也一并执行。相当于其它调试器中的“Step Over (单步跟踪)”。
这个命令必须在有源代码调试信息的情况下才可以使用(GCC编译时使用“-g”参数)。
(gdb) n
- si
si命令类似于s命令,但针对汇编指令。
(gdb) si
- ni
ni命令类似于n命令,但针对汇编指令。
(gdb) ni
观察点
查看内存
(gdb) x/s 0x4005a0 // 以字符串的形式查看 参数可以是地址或者变量名
0x4005a0: "hello world"
(gdb) x/t s // 以字符的形式查看
0x4005a0: 01101000
(gdb) x/t s // 以二进制查看
0x4005a0: 01101000
(gdb) x/x s // 以十六进制查看
0x4005a0: 0x68
(gdb) x/d s // 以十进制查看
0x4005a0: 104
(gdb) x/s $rbx // 查看寄存器指向内存的值(注意要加'$')
0x604900 <input_strings+320>: "flyers"
(gdb) x/x 4*$rcx+0x402460 // 可以找到运算后的地址指向的值
0x402478 <array.3159+24>: 0x09
寄存器
// 查看全部寄存器
(gdb) info registers
rax 0x4004f0 4195568
rbx 0x0 0
rcx 0x400510 4195600
rdx 0x7fffffffe598 140737488348568
rsi 0x7fffffffe588 140737488348552
rdi 0x1 1
rbp 0x7fffffffe4a0 0x7fffffffe4a0
rsp 0x7fffffffe4a0 0x7fffffffe4a0
r8 0x7ffff7dd6e80 140737351872128
r9 0x0 0
r10 0x7fffffffe2f0 140737488347888
r11 0x7ffff7a3ca40 140737348094528
r12 0x400400 4195328
r13 0x7fffffffe580 140737488348544
r14 0x0 0
r15 0x0 0
rip 0x400503 0x400503 <main+19>
eflags 0x246 [ PF ZF IF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
// 查看指定寄存器
(gdb) info register rax
rax 0x4004f0 4195568
查看汇编代码
(gdb) disassemble main
Dump of assembler code for function main:
0x00000000004004f0 <+0>: push %rbp
0x00000000004004f1 <+1>: mov %rsp,%rbp
0x00000000004004f4 <+4>: mov %edi,-0x14(%rbp)
0x00000000004004f7 <+7>: mov %rsi,-0x20(%rbp)
0x00000000004004fb <+11>: movq $0x4005a0,-0x8(%rbp)
=> 0x0000000000400503 <+19>: pop %rbp
0x0000000000400504 <+20>: retq
End of assembler dump.