Hexagon GDB Debugger介绍(36)

240 篇文章 11 订阅

Hexagon GDB Debugger介绍(36)

2.18 调试器文件

调试器需要知道要调试的程序的文件名,以便读取其符号表和启动程序。

2.18.1 指定文件的命令

您可能想要指定可执行文件名。 执行此操作的常用方法是在启动时使用调试器命令行选项(请参阅第 2.4 节)。

有时需要在调试器会话期间更改为不同的文件。 或者,您可能会运行调试器而忘记指定要使用的文件。 在这些情况下,指定新文件的调试器命令很有用。

file filename
使用文件名作为要调试的程序。 读取它是为了它的符号和纯记忆的内容。 也是使用run命令时执行的程序。 如果您不指定目录并且在调试器工作目录中找不到该文件,则调试器使用环境变量 PATH 作为要搜索的目录列表,就像 shell 在寻找要运行的程序时所做的那样。 您可以使用 path 命令为调试器和程序更改此变量的值。

在具有内存映射文件的系统上,名为 filename .syms 的辅助文件可以保存文件名的符号表信息。 如果是这样,调试器会从文件名 .syms 映射到符号表中,从而更快地启动。 有关更多信息,请参阅文件选项 -mapped 和 -readnow 的说明(可在命令行上使用,以及命令 file 、 symbol-file 或 add-symbol-file ,如下所述)。

file
没有参数的文件使调试器丢弃它在可执行文件和符号表上的任何信息。

exec-file [ filename ]
指定在文件名中找到要运行的程序(但不是符号表)。 如有必要,调试器会搜索环境变量 PATH 以定位您的程序。 省略文件名意味着丢弃有关可执行文件的信息。

symbol-file [ filename ]
从文件 filename 中读取符号表信息。 必要时搜索 PATH。 使用 file 命令让符号表和程序从同一个文件中运行。

不带参数的符号文件清除程序符号表上的调试器信息。

符号文件命令使调试器忘记其便利变量的内容、值历史以及所有断点和自动显示表达式。 这是因为它们可能包含指向内部数据记录符号和数据类型的指针,它们是在调试器中丢弃的旧符号表数据的一部分。

如果在执行一次后再次按 ,symbol-file不会重复。

当调试器针对特定环境进行配置时,它会理解为该环境生成的标准格式的调试信息; 您可以使用 GNU 编译器或其他符合本地约定的编译器。 最好的结果通常来自 GNU 编译器; 例如,使用六边形gcc,您可以为优化代码生成调试信息。

对于大多数类型的目标文件,除了使用 COFF 的旧 SVR3 系统之外,符号文件命令通常不会立即完整地读取符号表。 相反,它会快速扫描符号表以查找存在哪些源文件和哪些符号。 稍后阅读详细信息,根据需要一次一个源文件。

这种两阶段读取策略的目的是使调试器启动得更快。 在大多数情况下,它是不可见的,除了在读取特定源文件的符号表详细信息时偶尔会暂停。 (如果需要,set verbose 命令可以将这些暂停转换为消息。参见第 3.4.7 节。)

我们还没有实现 COFF 的两阶段策略。 当符号表以 COFF 格式存储时,符号文件立即完整地读取符号表数据。 请注意,“stabs-in-COFF”仍然采用两阶段策略,因为调试信息实际上是 stabs 格式。

symbol-file filename [ -readnow ] [ -mapped ]
file filename [ -readnow ] [ -mapped ]
如果您想确保调试器具有可用的整个符号表,您可以通过将 -readnow 选项与任何加载符号表信息的命令一起使用来覆盖读取符号表的调试器两阶段策略。

如果通过 mmap 系统调用在您的系统上可以使用内存映射文件,您可以使用另一个选项 -mapped 使调试器将程序的符号写入可重用文件。 未来的调试会话映射来自这个辅助符号文件的符号信息(如果程序没有改变),而不是花时间从可执行程序读取符号表。 使用 -mapped 选项与使用 -mapped 命令行选项启动调试器的效果相同。

您可以同时使用这两个选项,以确保辅助符号文件具有程序的所有符号信息。

名为 myprog 的程序的辅助符号文件称为 myprog .syms 。
一旦这个文件存在(只要它比相应的可执行文件更新),调试器总是在你调试 myprog 时尝试使用它; 不需要特殊的选项或命令。

.syms 文件特定于运行调试器的主机。 它保存了内部调试器符号表的精确图像。 它不能跨多个主机平台共享。

add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename -ssection address …
add-symbol-file 命令从文件 filename 中读取附加符号表信息。 当文件名已被动态加载(通过其他方式)到正在运行的程序中时,您将使用此命令。 address 应该是文件被加载的内存地址; 调试器无法自己解决这个问题。 您还可以指定任意数量的 -s 段地址对,以给出该段的显式段名称和基地址。 您可以将任何地址指定为表达式。

文件filename 的符号表被添加到最初用symbol-file 命令读取的符号表中。 您可以多次使用 add-symbol-file 命令; 这样读取的新符号数据不断添加到旧符号数据中。 要丢弃所有旧的符号数据,请使用不带任何参数的符号文件命令。

尽管文件名通常是共享库文件、可执行文件或其他一些已完全重定位以加载到进程中的目标文件,但您也可以从可重定位的 .o 文件中加载符号信息,只要:

❒ 文件的符号信息仅指该文件中定义的链接器符号,而不指其他目标文件定义的符号,
❒ 文件的符号信息所指的每个部分实际上都已加载到下级中,正如它在文件中出现的那样,并且
❒ 您可以确定加载每个部分的地址,并将这些地址提供给 add-symbol-file 命令。

一些嵌入式操作系统,如 Sun Chorus 和 VxWorks,可以将可重定位的文件加载到已经运行的程序中; 此类系统通常可以轻松满足上述要求。 然而,重要的是要认识到许多本地系统使用复杂的链接过程(例如 .linkonce 部分分解和 C++ 构造函数表组装),这使得这些要求难以满足。 通常,不能假设使用 add-symbol-file 读取可重定位目标文件的符号信息与以正常方式将可重定位目标文件链接到程序中具有相同的效果。

如果在使用后按 ,add-symbol-file 不会重复。

您可以像使用符号文件命令一样使用 -mapped 和 -readnow 选项来更改调试器管理文件名的符号表信息的方式。

section
section 命令将 exec 文件的 section SECTION 的基地址更改为 ADDR。 如果 exec 文件不包含节地址(例如 a.out 格式),或者文件本身指定的地址错误,则可以使用此选项。 每个部分必须单独更改。 info files 命令(如下所述)列出了所有部分及其地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值