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 registersrax 0x4004f0 4195568rbx 0x0 0rcx 0x400510 4195600rdx 0x7fffffffe598 140737488348568rsi 0x7fffffffe588 140737488348552rdi 0x1 1rbp 0x7fffffffe4a0 0x7fffffffe4a0rsp 0x7fffffffe4a0 0x7fffffffe4a0r8 0x7ffff7dd6e80 140737351872128r9 0x0 0r10 0x7fffffffe2f0 140737488347888r11 0x7ffff7a3ca40 140737348094528r12 0x400400 4195328r13 0x7fffffffe580 140737488348544r14 0x0 0r15 0x0 0rip 0x400503 0x400503 <main+19>eflags 0x246 [ PF ZF IF ]cs 0x33 51ss 0x2b 43ds 0x0 0es 0x0 0fs 0x0 0gs 0x0 0// 查看指定寄存器(gdb) info register raxrax 0x4004f0 4195568
查看汇编代码
(gdb) disassemble mainDump 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.