也就是 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
的内容。
参考
- DWARF 格式的详细信息可以参考 www.dwarfstd.org 官网中的介绍,包括了一个基础的教程。
- Articles in tag “Debuggers” 一个简单的调试器,包括了 ptrace 以及 DWARF 的使用方式。