温馨提示×

linux反汇编看调用栈

小樊
50
2026-10-06 09:27:37
栏目: 智能运维

在 Linux 下“反汇编 + 看调用栈”通常分两种场景:

  1. 运行时看调用栈(调试 / crash)
  2. 静态反汇编分析调用关系(无运行)

下面按实用角度讲。


一、运行时看调用栈(最常用)

1. 用 gdb 看调用栈

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

2. 反汇编当前函数

(gdb) disassemble
# 或指定函数
(gdb) disassemble main

查看调用指令:

(gdb) disassemble

关注:

  • call
  • push rbp
  • mov rbp, rsp

3. core dump 分析

ulimit -c unlimited
./a.out
gdb ./a.out core
(gdb) bt

二、无调试信息也能看调用栈

1. 用 objdump 反汇编

objdump -d ./a.out > dis.txt

查找 main:

objdump -d ./a.out | grep "<main>:"

看 call:

objdump -d ./a.out | grep call

2. 用 nm / readelf 看符号

nm ./a.out
readelf -s ./a.out

如果 stripped:

file ./a.out
# stripped

三、手动分析调用栈(x86_64)

调用约定(System V AMD64)

  • 参数:RDI, RSI, RDX, RCX, R8, R9
  • 返回值:RAX
  • 栈帧:
push rbp
mov rbp, rsp
sub rsp, xxx

从崩溃地址反推

(gdb) info registers
(gdb) x/20x $rsp

手动看返回地址:

(gdb) x/5i $rip
(gdb) x/a $rbp+8   # 返回地址

四、高级工具

1. perf(调用栈 + 性能)

perf record -g ./a.out
perf report

2. addr2line(地址转源码)

addr2line -e ./a.out 0x4005b6

3. ltrace / strace

ltrace ./a.out
strace ./a.out

五、典型分析流程(推荐)

  1. gdb ./a.out
  2. run
  3. bt
  4. frame N
  5. disassemble
  6. info registers
  7. 对照 objdump -d

如果你愿意,可以告诉我:

  • 是 C / C++ / 汇编?
  • x86 / x86_64 / ARM?
  • 是 崩溃分析 还是 逆向分析?

我可以直接给你对应命令和实例。

0 踩