SuperAPI AI 工具集

dwarf-expert

编程与开发

查看项目

更新于 10-16 04:00

技能介绍

用途

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 数据完整性以及使用相关解析库的工程与研究场景。