GDB怎么切换到汇编代码查看

轻明同学_8501

轻明同学_8501

2026-09-08

1015人浏览

原创

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

gdb怎么切换到汇编代码查看

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++),下半部分汇编,中间用 > 对齐当前执行点。但它有个关键陷阱:源码行和汇编指令不是一一映射的。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

典型问题:

  • 开启 -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。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

40

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

40

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

80

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

80

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ 手册教程
C++ 手册教程

共41课时 | 78.5万人学习