DWARF 格式简介

2017-12-10 linux c/cpp

也就是 Debugging With Attributed RecordFormats, DWARF ,到目前为止,应该包括了 V1~5 共五个版本,其中 dwarf2 对 dwarf1 的改变很大,而后续的版本基本上是对前者的扩展。

这一格式独立于语言,不过使用比较多的是 C/C++ ,这里简单介绍在 GDB 中,如何对这些调试信息进行组织、实现,并且如何利用调试信息进行 C 语言级别的调试。

简介

一般来说,代码的调试信息要远大于二进制程序本身,包括了可执行程序、动态库等等,一般的 Linux 发行版本会使用类似 debuginfo 的包,作为独立的调试信息。

对应的 debuginfo 包可以从 debuginfo.centos.org 中获取,如果在使用 gdb 时没有加载,除了路径、权限等问题外,可能是版本不匹配。

----- 设置全局的DebugInfo保存目录
(gdb) set debug-file-directory <directory>

----- 查看当前的全局配置目录
(gdb) show debug-file-directory

对于 CentOS 来说,一般保存在 /usr/lib/debug 目录下,

节内容介绍

在编译的时候需要添加一个 -g 参数,最终生成的二进制文件会包含了很多 .debug_* 的字段,保存了调试相关的信息,主要包含了如下的段。

  • .debug_info 调试信息主要内容,例如函数、参数、变量等。
  • .debug_line 地址和源文件行的对应信息。
  • .debug_str 在上述的 .debug_info 中使用的字符串表。

上述的 .debug_info.debug_line 节是必须有的,其它的根据不同的链接脚本可选。

可以通过 readelf -wI <EXEC> 命令查看对应的节的内容,其中 N 对应了段名称的第一个字母,例如 -wi 对应了 .debug_info 的内容,-wl 就是 .debug_line 的内容。

参考