符号文件必读

要把调试器用到高阶的水平,就一定要理解调试符号,学会如何与调试器相互配合找到合适的符号信息。本文针对调试Linux程序来讲一下使用符号的一些关键事项。

符号信息分类:

可以把调试符号信息分成如下三大类。

  • 帧数据,这个信息不仅调试器需要,而且程序运行时也需要,调试时用于产生调用栈,运行时,做异常处理,用来做栈展开。这类信息因为运行时也需要,所以做strip操作时,也会把这个信息留在可执行文件中。
  • DWARF符号,这类信息是专门给调试器用的,所以使用strip命令剥离符号时,会剥离掉,产生所谓的“分离的符号文件”(separated symbol file)。
  • ELF符号,这类符号主要是供动态链接使用的,所以通常放在可执行文件中,即使没有-g编译也会有,做strip操作时,也会把这个信息留在可执行文件中。

符号文件的种类

Linux下的符号文件有如下几种:

  • 剥离出来的纯符号文件,比如通过debuginfod下载下来的符号文件,以及从Ubuntu符号文件服务器上安装的符号包;在NDB中,这样的文件会增加上独特的.dwf后缀,以示区别。在NDB中使用lm命令观察时,会显示为 (pdb/dwarf symbols)
  • 剥离过符号的可执行文件,这类文件中包含elf符号和帧数据,在NDB中会显示为(exported symbols)
  • 包含dwarf符号的可执行文件,一般是手工使用-g选项构建后没有执行过strip操作的文件
  • 跨模块的符号文件,一般是从debuginfod服务器下载下来的文件,以.altlink后缀结束

NDB获取符号文件的方式

因为符号文件的重要性,NDB内建了如下多种方式来获取符号文件

  • 从debuginfod服务器下载,下载下来的文件会以.dwf或者.altlink后缀结束
  • 从目标机的/usr/lib/debug/目录下载,这些文件一般是在安装符号文件包时安装的,下载下来的文件也会以.dwf结尾
  • 从目标机下载的可执行文件
  • 使用Linux版本的ndb时,ndb也可以直接使用本机的上述两种文件

配置符号下载策略

大家可以通过.sympath命令来定制符号下载策略,NDB支持的下载方式有如下两种:

  • did:通过debuginfod服务器下载
  • tgt:在调试应用程序时,通过ndstub从目标机下载
    每一种下载方式的设置格式为:
    下游库路径[服务器的URL];
    比如dide:\symbols;

可以同时设置多种下载方式,比如
.sympath dide:\symbols;tgte:\symbols;

设置多种方式时,顺序是有关的,放在前面的优先级高,先使用。

作者:Zhang Yinkui  创建时间:2024-10-10 17:15
最后编辑:Zhang Yinkui  更新时间:2024-10-10 17:49