用途
dwarf-expert 用于提供关于 DWARF 标准以及如何与 DWARF 文件交互的技术知识与专长。其任务包括:回答关于 DWARF 标准的问题、提供各种 DWARF 特性的示例、解析和/或创建 DWARF 文件,以及编写、修改、分析那些与 DWARF 数据交互的代码。
何时使用
- 理解或解析已编译二进制中的 DWARF 调试信息
- 回答关于 DWARF 标准(v3、v4、v5)的问题
- 编写或审查与 DWARF 数据交互的代码
- 使用 dwarfdump 或 readelf 提取调试信息
- 使用 llvm-dwarfdump --verify 验证 DWARF 数据完整性
- 使用 DWARF 解析库(libdwarf、pyelftools、gimli 等)
何时不使用
- DWARF v1/v2 分析:专长仅限 3、4、5 版本。
- 通用 ELF 解析:若不需要 DWARF 数据,应使用标准 ELF 工具。
- 可执行程序调试:调试可执行代码/运行时行为应使用专用调试工具(gdb、lldb 等)。
- 二进制逆向工程:应使用专用逆向工具(Ghidra、IDA),除非专门分析 DWARF 段。
- 编译器调试:DWARF 生成问题与具体编译器相关,不在本技能覆盖范围内。
权威来源
当需要具体的 DWARF 标准信息时,可使用以下权威来源:
- 官方 DWARF 标准(dwarfstd.org):使用网络搜索查找官方 DWARF 规范的特定章节。诸如 "DWARF5 DW_TAG_subprogram attributes site:dwarfstd.org" 的查询较为有效。
- LLVM DWARF 实现:LLVM 项目在 llvm/lib/DebugInfo/DWARF/ 的 DWARF 处理代码可作为可靠的参考实现。关键文件包括:
- DWARFDie.cpp — DIE 处理与属性访问
- DWARFUnit.cpp — 编译单元解析
- DWARFDebugLine.cpp — 行号信息
- DWARFVerifier.cpp — 校验逻辑
- libdwarf:位于 github.com/davea42/libdwarf-code 的参考 C 实现,提供对 DWARF 数据结构的详细处理。
验证工作流
使用 llvm-dwarfdump 的验证选项来校验 DWARF 数据完整性。
结构校验
# 验证 DWARF 结构(编译单元、DIE 关系、地址范围)
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>
--statistics 输出有助于跨编译器版本与优化级别比较调试信息质量。
常见验证模式
- 编译之后:在分发前验证二进制的 DWARF 有效
- 比较构建:使用 --statistics 检测调试信息质量回退
- 调试调试器:识别导致调试器问题的格式错误 DWARF
- DWARF 工具开发:针对已知良好的二进制校验解析器输出
解析 DWARF 调试信息
readelf
ELF 文件可通过 readelf 命令解析({baseDir}/reference/readelf.md)。可用于通用 ELF 信息,但 DWARF 专用解析更推荐 dwarfdump。
dwarfdump
DWARF 文件可通过 dwarfdump 命令解析,它在解析和显示复杂 DWARF 信息方面比 readelf 更有效,大多数 DWARF 解析任务应使用它({baseDir}/reference/dwarfdump.md)。
与代码交互
本技能支持编写、修改和审查与 DWARF 数据交互的代码。这可能涉及从零开始解析 DWARF 调试数据的代码,或利用库解析与交互 DWARF 数据的代码({baseDir}/reference/coding.md)。
选择方法
┌─ 需要验证 DWARF 数据完整性?
│ └─ 使用 `llvm-dwarfdump --verify`(见上方验证工作流)
├─ 需要回答关于 DWARF 标准的问题?
│ └─ 搜索 dwarfstd.org 或参考 LLVM/libdwarf 源码
├─ 需要简单的段转储或通用 ELF 信息?
│ └─ 使用 `readelf`({baseDir}/reference/readelf.md)
├─ 需要解析、搜索和/或转储 DWARF DIE 节点?
│ └─ 使用 `dwarfdump`({baseDir}/reference/dwarfdump.md)
└─ 需要编写、修改或审查与 DWARF 数据交互的代码?
└─ 参考编码文档({baseDir}/reference/coding.md)
限制
- 仅在任务明确匹配上述范围时使用本技能。
- 不要将输出视为环境特定验证、测试或专家审查的替代。
- 若缺少必要输入、权限、安全边界或成功标准,应停止并请求澄清。
适用场景
适用于需要理解 DWARF 标准细节、解析已编译二进制的调试信息、编写或审查 DWARF 处理代码、验证 DWARF 数据完整性以及使用相关解析库的工程与研究场景。