在 Linux 下“反汇编 + 看调用栈”通常分两种场景:
下面按实用角度讲。
gdb ./a.out
(gdb) run
# 崩溃或断点后
(gdb) bt
# 更详细
(gdb) bt full
查看某一层函数:
(gdb) frame 2
(gdb) info locals
(gdb) info args
如果没有符号表:
(gdb) bt
# 只能看到地址
(gdb) x/10i $pc
(gdb) disassemble
# 或指定函数
(gdb) disassemble main
查看调用指令:
(gdb) disassemble
关注:
callpush rbpmov rbp, rspulimit -c unlimited
./a.out
gdb ./a.out core
(gdb) bt
objdump -d ./a.out > dis.txt
查找 main:
objdump -d ./a.out | grep "<main>:"
看 call:
objdump -d ./a.out | grep call
nm ./a.out
readelf -s ./a.out
如果 stripped:
file ./a.out
# stripped
push rbp
mov rbp, rsp
sub rsp, xxx
(gdb) info registers
(gdb) x/20x $rsp
手动看返回地址:
(gdb) x/5i $rip
(gdb) x/a $rbp+8 # 返回地址
perf record -g ./a.out
perf report
addr2line -e ./a.out 0x4005b6
ltrace ./a.out
strace ./a.out
gdb ./a.outrunbtframe Ndisassembleinfo registersobjdump -d如果你愿意,可以告诉我:
我可以直接给你对应命令和实例。