layout asm 命令需在 TUI 模式下使用,启动时加 -tui 或按 Ctrl+x+a,仅显示滚动汇编窗口并高亮当前指令;无源码或未运行程序时仍可用,但需先执行 run/start 才能渲染。

layout asm 命令直接显示汇编窗口
启动 GDB 后,只要程序已加载(file ./a.out 或 gdb ./a.out),就能立刻用 layout asm 切换到纯汇编视图。这个命令会清空当前布局,只保留一个滚动式汇编代码窗口,顶部高亮当前指令指针(> 符号),适合快速扫读函数入口、跳转逻辑或确认指令对齐。
常见错误现象:执行 layout asm 后报错 Command not found: layout —— 这说明你没启用 TUI 模式。必须用 gdb -tui ./a.out 启动,或在普通模式下先按 Ctrl + x + a 进入 TUI。
注意点:
-
layout asm不依赖源码是否可用;即使没有-g编译,也能显示反汇编结果 - 窗口默认聚焦在当前 PC 所在函数,但不会自动跳转到符号名对应位置(比如
main),需配合disassemble main或stepi触发刷新 - 若汇编窗口空白,大概率是程序还没运行(
run或start未执行),TUI 只在有有效 PC 地址时渲染内容
disassemble 命令查看任意函数/地址的汇编
disassemble(简写 dis)是脱离 TUI 也能用的核心命令,不依赖图形界面,适合脚本化或远程调试场景。它输出的是静态反汇编结果,不是实时滚动视图,但更可控。
常用组合:
-
disassemble main:查看main函数完整汇编 -
disassemble $pc,+20:从当前 PC 开始反汇编 20 条指令($pc是寄存器名,必须加$) -
disassemble 0x401100,0x401150:按地址范围反汇编(十六进制地址需带0x) -
disassemble /r func2:加/r显示机器码字节(如48 89 f7)+ 对应汇编,方便核对 patch 或 shellcode
性能影响:对大型函数(如优化后的 std::vector::push_back)执行 disassemble 可能卡顿 1–2 秒,GDB 需解析整个符号段并做重定位计算——此时建议限定地址范围而非函数名。
layout split 同时看源码和汇编,但容易误判对应关系
layout split 是最常用的双视图模式:上半部分源码(C/C++),下半部分汇编,中间用 > 对齐当前执行点。但它有个关键陷阱:源码行和汇编指令不是一一映射的。
典型问题:
- 开启
-O2编译后,一行i++可能被内联、消除、合并成一条add rax, 1,甚至完全消失;此时源码窗口显示第 15 行,汇编窗口却停在第 22 行对应的指令上 - 汇编窗口中某条指令右侧括号里写的
是真实偏移,而源码窗口的行号只是调试信息里的“尽力匹配”,不可全信 - 切换函数(如
stepi进入func2)后,源码窗口可能卡在旧文件,需手动list func2刷新
实用技巧:用 info line *$pc 查当前 PC 对应的源码文件与行号,比目测对齐更可靠;再用 disassemble $pc-8,$pc+16 锁定上下文。
set disassembly-flavor intel 切换语法风格
默认 AT&T 语法(movq %rax, %rbx)对多数人不友好,set disassembly-flavor intel 能立刻切到 Intel 风格(mov rbx, rax),参数顺序更符合直觉,也和 IDA/Ghidra 保持一致。
这个设置只影响显示,不影响功能。但要注意:
- 必须在
layout asm或disassemble之前设置,否则已缓存的视图不会刷新(可补一句refresh强制重绘) - Intel 风格下,立即数前不加
$,内存引用用DWORD PTR [rax]而非(%rax),初学者容易漏掉PTR关键字导致误解 - 某些老版本 GDB(如 7.12 以前)不支持该选项,会报错
Invalid flavor intel,此时只能用set disassembly-flavor att回退
真正容易被忽略的是:set disassembly-flavor 的作用域是当前调试会话,重启 GDB 就失效。如果频繁使用,建议写入 ~/.gdbinit 加一行 set disassembly-flavor intel。











