Hexagon GDB Debugger介绍(38)

240 篇文章 11 订阅

2.18.2 单独文件中的调试信息

调试器允许您将程序的调试信息放在与可执行文件本身分开的文件中,以允许调试器自动查找和加载调试信息。 由于调试信息可能非常大,有时比可执行代码本身还要大,因此一些系统将其可执行文件的调试信息分发在单独的文件中,用户仅在需要调试问题时才能安装这些文件。

如果可执行文件的调试信息已被提取到单独的文件中,则该可执行文件应包含一个调试链接,给出调试信息文件的名称(没有目录组件),以及其内容的校验和。 (调试链接的确切形式如下所述。)如果包含可执行文件的目录的全名为 execdir,并且可执行文件具有指定名称 debugfile 的调试链接,则调试器将自动搜索调试信息文件 在以下位置:

■ 包含可执行文件的目录(即,它将查找名为 execdir/debugfile 的文件
■ 该目录的一个名为 .debug 的子目录(即文件 execdir/.debug/debugfile
■ 全局调试文件目录的子目录,包含可执行文件的完整路径和链接名称(即 globaldebugdir/execdir/debugfile ,其中 globaldebugdir 是全局调试文件目录,execdir 已转换为相对路径)

调试器在每个名称下检查一个调试信息文件,其校验和与链接中给出的匹配,并从它找到的第一个文件中读取调试信息。

因此,例如,如果您要求调试器调试 /usr/bin/ls ,它有一个包含名称 ls.debug 的链接,并且全局调试目录是 /usr/lib/debug ,那么调试器将查找 debug /usr/bin/ls.debug 、 /usr/bin/.debug/ls.debug 和 /usr/lib/debug/usr/bin/ls.debug 中的信息。

您可以设置全局调试信息目录的名称,并查看调试器当前使用的名称

set debug-file-directory directory
将调试器搜索单独的调试信息文件的目录设置为目录。

show debug-file-directory
显示调试器搜索单独调试信息文件的目录。

调试链接是名为 .gnu_debuglink 的可执行文件的特殊部分。 该部分必须包含以下项目:

■ 一个文件名,删除了所有前导目录组件,后跟一个零字节
■ 零到三个字节的填充,根据需要达到该部分内的下一个四字节边界
■ 一个四字节的 CRC 校验和,存储在与可执行文件本身相同的字节序中。 校验和是通过下面给出的函数在调试信息文件的全部内容上计算的,传递零作为 crc 参数。

任何可执行文件格式都可以带有调试链接,只要它可以包含名为 .gnu_debuglink 的部分,其中包含上述内容。

调试信息文件本身应该是一个普通的可执行文件,包含一整套链接器符号、节和调试信息。调试信息文件的部分应该与原始文件具有相同的名称、地址和大小,但它们不需要包含任何数据:很像普通可执行文件中的 .bss 部分。

截至 2002 年 12 月,还没有标准的 GNU 实用程序来生成分离的可执行/调试信息文件对。 Ulrich Drepper 的 elfutils 包,从 0.53 版本开始,包含一个 strip 命令的版本,这样命令 strip foo -f foo.debug 从可执行文件 foo 中删除调试信息,将它放在文件 foo.debug 中,然后留下foo 中的调试链接。

由于有许多不同的方法来计算 CRC(不同的多项式、反转、字节顺序等),描述 .gnu_debuglink 部分中使用的 CRC 的最简单方法是给出计算它的函数的完整代码:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.18.3 读取符号文件时出错

在读取符号文件时,调试器偶尔会遇到问题,例如它无法识别的符号类型,或编译器输出中的已知错误。 默认情况下,调试器不会通知您此类问题,因为它们相对常见并且主要是调试编译器的人感兴趣。 如果您有兴趣查看有关错误构造符号表的信息,您可以要求调试器只打印关于每种此类问题的一条消息,无论问题发生多少次; 或者你可以要求调试器打印更多的消息,以查看问题发生的次数,使用 set notice 命令(参见第 3.4.7 节)。

当前打印的消息及其含义包括:
inner block not inside outer block in symbol
符号信息显示符号作用域的开始和结束位置(例如在函数或语句块的开头)。 此错误表示内部作用域块未完全包含在其外部作用域块中。

调试器通过将内部块视为与外部块具有相同的作用域来规避该问题。 在错误消息中,如果外部块不是函数,符号可能会显示为“(不知道)”。

block at address out of order
符号作用域块的符号信息应按地址递增的顺序出现。 此错误表明它没有这样做。

调试器没有规避这个问题,并且无法在它正在读取的符号的源文件中定位符号。 (您通常可以通过在 上指定 set verbose 来确定哪个源文件受到影响。请参阅第 3.4.7 节。)

bad block start address patched
符号作用域块的符号信息的起始地址小于前一源代码行的地址。 已知这会在 SunOS 4.1.1(及更早版本)C 编译器中发生。

调试器通过将符号作用域块视为从前一个源代码行开始来规避该问题。

bad string table offset in symbol n
符号编号 n 包含指向字符串表的指针,该指针大于字符串表的大小。

调试器通过考虑符号具有名称 foo 来规避问题,如果许多符号以该名称结束,这可能会导致其他问题。

unknown symbol type 0xnn
符号信息包含调试器尚不知道如何读取的新数据类型。 0x nn 是未理解信息的符号类型,十六进制。

调试器通过忽略此符号信息来规避错误。 这通常允许您调试程序,尽管某些符号不可访问。 如果你遇到这样的问题并想调试它,你可以用它自己调试六边形gdb,在抱怨上断点,然后转到函数read_dbx_symtab并检查*bufp以查看符号。

stub type has NULL name
调试器找不到结构或类的完整定义。

const/volatile indicator missing (ok if using g++ v1.x), got…
C++ 成员函数的符号信息缺少一些最新版本的编译器应该为其输出的信息。

info mismatch between compiler and debugger
调试器无法解析编译器输出的类型规范。

2.18.4 调试器数据文件

调试器有时会读取辅助数据文件。 这些文件保存在称为数据目录的目录中。

可以设置数据目录的名称,查看当前目录的名称。

set data-directory directory
指定调试器在其中搜索辅助数据文件的目录。

show data-directory
显示调试器在其中搜索辅助数据文件的目录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值