x86 汇编与 GDB 调试

1 min read [x86 汇编语言] post #x86#gdb#debugging

GDB 可以帮助我们把源码、汇编和运行状态联系起来。

常用命令

info registers
disassemble
x/16gx $rsp
bt

观察栈

x/16gx $rsp 可以从当前栈顶开始查看 16 个 8 字节值。

断点

break main
run

进入函数后,可以用 stepi 单步执行一条机器指令。

调试汇编时,不要只看指令,也要同时看寄存器和内存。

一次调试流程

我通常按这个顺序观察:

  1. break main 进入程序。
  2. disassemble 看当前函数汇编。
  3. info registers 看寄存器。
  4. x/16gx $rsp 看栈。
  5. stepi 单步执行一条机器指令。

这样可以把“指令执行前后寄存器怎么变”看得很清楚。

源码和汇编一起看

如果带调试信息编译:

g++ -g -O0 main.cpp -o app

GDB 可以在源码行和汇编指令之间切换。-O0 更适合学习,因为编译器不会做太多优化,源码和汇编的对应关系更直观。

小结

学习汇编不是为了把所有程序都写成汇编,而是为了在遇到崩溃、栈损坏、ABI 问题、性能热点时,能看懂机器实际执行了什么。

评论

...

正在读取评论。