温馨提示×

反汇编linux指令怎排查错

小樊
47
2026-09-30 13:47:37
栏目: 智能运维

在 Linux 下通过反汇编排查程序错误,通常用于:

  • 程序崩溃(segfault、abort)
  • 逻辑错误但无源码或优化后看不懂
  • 定位某条指令导致的异常
  • 分析第三方/二进制程序

下面按实战流程给你一个清晰、可操作的排查思路。


一、前提准备

1. 尽量保留调试信息

编译时加:

gcc -g -O0 -o test test.c
  • -g:调试符号
  • -O0:不优化,反汇编好读

如果是已发布程序:

  • 有 .debug 或 debuginfo 包最好
  • 没有也能反汇编,只是没有函数名/变量名

二、常见反汇编工具

工具 用途
objdump 静态反汇编
gdb 动态调试 + 反汇编
nm 看符号
addr2line 地址转源码行
readelf 看 ELF 结构
strace 系统调用层面

三、静态反汇编(不看运行)

1. 反汇编整个程序

objdump -d -M intel test
  • -d:反汇编代码段
  • -M intel:Intel 语法(比 AT&T 好读)

2. 反汇编某个函数

objdump -d -M intel test | grep -A 50 "<main>:"

3. 看符号

nm test

四、动态调试(核心方法)

1. 用 gdb 跑程序

gdb ./test
(gdb) run

程序崩了后:

(gdb) bt

看调用栈

(gdb) disassemble

反汇编当前崩溃位置

(gdb) info registers

看寄存器状态(很重要)


五、崩溃排查实战流程

场景:Segmentation fault

1. 看崩溃地址

(gdb) bt
#0  0x0000000000401145 in func ()

2. 反汇编崩溃点

(gdb) disassemble 0x401145

例如:

mov rax, [rdi]

说明:

  • rdi 是 NULL
  • 解引用空指针 → segfault

3. 看寄存器

(gdb) info registers rdi

六、优化后代码难读怎么办?

1. 关优化重新编译

gcc -O0 -g

2. 用源码对照

(gdb) list

3. 用 layout

(gdb) layout asm

或

(gdb) layout split

同时看源码 + 汇编


七、没有源码时怎么定位问题

1. 用 core dump

ulimit -c unlimited
./test
gdb ./test core

2. 地址转源码

addr2line -e test 0x401145

3. 看字符串/常量

strings test

八、常见错误对应的汇编特征

错误 汇编特征
空指针解引用 mov [reg], ... reg=0
栈溢出 push 很多 / sub rsp, 巨大
除零 div / idiv
越界写 修改不属于自己的地址
死循环 jmp 回自己

九、推荐排查顺序(总结)

  1. gdb 运行
  2. bt 看哪里崩
  3. disassemble 看指令
  4. info reg 看数据
  5. addr2line 定位源码
  6. 必要时 objdump 静态分析

如果你愿意,可以把:

  • 报错信息
  • bt 输出
  • 或一段反汇编代码

贴出来,我可以直接帮你逐条分析是哪条指令出错。

0 踩