附录

gdb调试汇编指令

关于GDB调试C程序的常用命令与手段就不多说了,这里主要介绍一下如何对C程序做到汇编指令级别的调试。 首先是获取汇编代码,这可以通过disassemble命令或x命令或类似的命令:

// 下断点
(gdb) b test.go:28
The current source language is "auto; currently minimal".
// 查看断点所在函数的反汇编代码
(gdb) disassemble
Dump of assembler code for function main.main:
0x00000000004010b0 <main.main+0>:    mov    %fs:0xfffffffffffffff8,%rcx
0x00000000004010b9 <main.main+9>:    cmp    0x10(%rcx),%rsp
0x00000000004010bd <main.main+13>:    jbe    0x40112b <main.main+123>

// 查看下一条要执行的汇编代码,以下两种方法均可
// 如果要调试汇编代码好像必须执行这个才可以
(gdb) x/i $pc
0x4010c3 <main.main+19>:    movq   $0x1,0x30(%rsp)
(gdb) x/i $rip
0x4010c3 <main.main+19>:    movq   $0x1,0x30(%rsp)

// 单步执行si or ni
(gdb) x/i $pc
0x401000 <main.f>:    mov    %fs:0xfffffffffffffff8,%rcx
(gdb) si
0x0000000000401009    9    func f(a, b int) (int, int) {
(gdb) x/i $pc
0x401009 <main.f+9>:    mov    0x10(%rcx),%rsi

// 查看寄存器和内存地址的值
(gdb) p/x $rcx
$1 = 0xc820000f00
(gdb) x/1ug 0xc820000f00
0xc820000f00:    859530522624
(gdb) x/1ug 0xc820000f08
0xc820000f08:    859530524640
(gdb) x/1ug 0xc820000f10
0xc820000f10:    859530523264
(gdb)

参考资料

results matching ""

    No results matching ""