DWARF 调试格式专家
为解析 DWARF 调试文件、理解 DWARF 标准(v3-v5)、校验调试信息完整性、以及编写或审阅与 DWARF 数据交互的代码提供专家能力。
何时使用
- 从编译产物中理解或解析 DWARF 调试信息。
- 回答 DWARF 标准(v3、v4、v5)相关问题,或给出某个 DWARF 特性的示例。
- 编写、修改或审阅与 DWARF 数据交互的代码。
- 用
dwarfdump/readelf提取调试信息,或用llvm-dwarfdump --verify校验完整性。 - 使用 DWARF 解析库(libdwarf、pyelftools、gimli 等)。
不该用(负边界):
- DWARF v1/v2:能力仅覆盖 v3/v4/v5。
- 纯 ELF 解析:不需要 DWARF 数据时用标准 ELF 工具即可。
- 运行时调试:调试可执行代码/运行时行为请用 gdb、lldb 等专用调试器。
- 二进制逆向:除非专门分析 DWARF 段,否则用 Ghidra、IDA 等逆向工具。
- 编译器问题:DWARF 生成缺陷与具体编译器相关,不在本技能范围。
步骤 / 指令
按需求选择路径:
┌─ 要校验 DWARF 数据完整性?
│ └─ 用 `llvm-dwarfdump --verify`(见下「校验工作流」)
├─ 要回答 DWARF 标准问题?
│ └─ 搜 dwarfstd.org,或参考 LLVM / libdwarf 源码
├─ 只需简单段转储或一般 ELF 信息?
│ └─ 用 `readelf`
├─ 要解析、搜索或转储 DWARF DIE 节点?
│ └─ 用 `dwarfdump`(比 readelf 更擅长复杂 DWARF,多数解析任务首选)
└─ 要写、改或审阅与 DWARF 交互的代码?
└─ 参考下「编写代码」与权威源
权威来源(需要精确标准时查证,不要凭记忆):
- 官方 DWARF 标准 dwarfstd.org:用 web 搜索定位规范具体章节,如查询
DWARF5 DW_TAG_subprogram attributes site:dwarfstd.org。 - LLVM 实现
llvm/lib/DebugInfo/DWARF/,可靠的参考实现,关键文件:DWARFDie.cpp—— DIE 处理与属性访问DWARFUnit.cpp—— 编译单元解析DWARFDebugLine.cpp—— 行号信息DWARFVerifier.cpp—— 校验逻辑
- libdwarf:github.com/davea42/libdwarf-code,参考 C 实现,对 DWARF 数据结构处理详尽。
示例
结构校验(编译单元、DIE 关系、地址范围):
# 校验 DWARF 结构
llvm-dwarfdump --verify <binary>
# 带完整错误输出与摘要
llvm-dwarfdump --verify --error-display=full <binary>
# 机读 JSON 错误摘要
llvm-dwarfdump --verify --verify-json=errors.json <binary>
质量指标(以 JSON 输出调试信息质量,便于跨编译器版本/优化级别对比):
llvm-dwarfdump --statistics <binary>
常见校验场景:
- 编译后:分发前确认二进制含合法 DWARF。
- 对比构建:用
--statistics检测调试信息质量回退。 - 排查调试器:定位导致调试器异常的畸形 DWARF。
- DWARF 工具开发:用已知正确的二进制验证解析器输出。
注意事项
- 多数 DWARF 专项解析优先
dwarfdump,它比readelf更能处理与展示复杂 DWARF 信息;readelf用于一般 ELF 信息或简单段转储。 - 编写解析代码时,既可从零解析 DWARF 段,也可借助 libdwarf / pyelftools / gimli 等库;涉及具体 tag/attribute 语义时务必回查权威源核对。
- 仅在任务明确落在上述范围内时使用本技能。
- 输出不能替代环境相关的验证、测试或专家评审。
- 若缺少必要输入、权限、安全边界或成功判据,先停下来确认再继续。
互见
- related:与 ELF/二进制分析、编译工具链相关技能横向相关。
- combines_with:可与逆向分析、崩溃栈解析类技能组合,用 DWARF 还原源码级符号与行号。
采编自 sickn33/antigravity-awesome-skills(MIT)。