附录
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)