**
1. DWARF 调试格式简介
DWARF (Debugging With Attributed Record Formats) 是一种被广泛使用的标准化调试数据格式 1。它最初与可执行和可链接格式 (ELF) 一同设计,但其本身独立于对象文件格式 1。DWARF 的核心目的是支持源码级调试 1。编译器在编译过程中生成 DWARF 信息,这些信息描述了源码与最终可执行程序之间的复杂关系,使得调试器能够将低级机器指令映射回高级编程语言的构造 3。
DWARF 信息以调试信息条目 (Debugging Information Entry, DIE) 的形式组织,每个 DIE 代表程序中的一个实体,如变量、类型或函数 1。每个 DIE 包含一个标签 (tag) 用以标识其类型(例如 DW_TAG_variable、DW_TAG_subprogram),以及一组属性 (attributes) 用以描述该实体的具体特征(例如 DW_AT_name、DW_AT_type、DW_AT_decl_file、DW_AT_decl_line)1。DIE 可以嵌套,形成树状结构,反映源码的层级关系 1。
这些调试信息通常存储在可执行文件的特定“节” (sections) 中,例如:
- .debug_info:包含核心的 DIE 数据,描述了程序结构、变量、类型等 1。
- .debug_line:存储行号表信息,用于将机器指令地址映射回源代码的行号 1。
- .debug_abbrev:定义了 .debug_info 中 DIE 所使用的缩写,以减小体积 1。
- .debug_loc (在 DWARF 5 中被 .debug_loclists 替代):描述变量位置信息 1。
- .debug_ranges (在 DWARF 5 中被 .debug_rnglists 替代):描述代码地址范围 1。
通过解析这些 DWARF 节区,调试器能够实现诸如设置断点、单步执行、检查变量值、查看调用栈等功能,极大地简化了程序开发和问题定位过程 2。**