x86 汇编与 GDB 调试
GDB 可以帮助我们把源码、汇编和运行状态联系起来。
常用命令
info registers
disassemble
x/16gx $rsp
bt
观察栈
x/16gx $rsp 可以从当前栈顶开始查看 16 个 8 字节值。
断点
break main
run
进入函数后,可以用 stepi 单步执行一条机器指令。
调试汇编时,不要只看指令,也要同时看寄存器和内存。
一次调试流程
我通常按这个顺序观察:
break main进入程序。disassemble看当前函数汇编。info registers看寄存器。x/16gx $rsp看栈。- 用
stepi单步执行一条机器指令。
这样可以把“指令执行前后寄存器怎么变”看得很清楚。
源码和汇编一起看
如果带调试信息编译:
g++ -g -O0 main.cpp -o app
GDB 可以在源码行和汇编指令之间切换。-O0 更适合学习,因为编译器不会做太多优化,源码和汇编的对应关系更直观。
小结
学习汇编不是为了把所有程序都写成汇编,而是为了在遇到崩溃、栈损坏、ABI 问题、性能热点时,能看懂机器实际执行了什么。
评论
...正在读取评论。