设置调试文件目录后再次搜索符号

Posted

技术标签:

【中文标题】设置调试文件目录后再次搜索符号【英文标题】:Search symbols again after setting debug-file-directory 【发布时间】:2016-03-17 20:04:40 【问题描述】:

我已经建立了一个生成二进制文件的构建过程,然后将调试信息从中分离出来(启用了构建 ID)。

构建还可以生成带有set debug-file-directory <dir> 之类的行的.gdbinit 文件,因此调试器可以找到它们(项目中有很多可执行文件和库)。

但是当我运行$ gdb myprogram 时,gdb 找不到符号。我必须做(gdb) file myprogram 重新搜索调试符号文件。好像.gdbinit是在打开myprogram之后执行的。

如何让它自动化?

【问题讨论】:

.gdbinit 被执行。它设置了debug-file-directory,但为时已晚。 .gdbinit 文件位于构建目录中,因为它们是在那里生成的。 你确定吗?你能用“(gdb) show debug-file-directory”检查吗?你能提供这个命令的输出吗? @pmod,是的,它显示了一个正确的目录(它从 .gdbinit 获得)。我只需要做file myprogram 就可以真正开始使用它。但是如果set debug-file-directory <dir>在主目录的~/.gdbinit中,它会立即应用,所以$ gdb myprogram就足够了。 你能检查一下“(gdb) show auto-load local-gdbinit”吗? add-auto-load-safe-path 被禁用并找到本地.gdbinit 时,它会大声抱怨。因此,“从当前目录自动加载 .gdbinit 脚本已开启”。 【参考方案1】:

基本上,.gdbinit 文件用于设置调试环境(为长命令添加别名,加载自定义命令,设置打印模式等),而不是特定的调试会话

查看gdb startup order,考虑到home .gdbinit 工作正常,本地.gdbinit 文件无法实现(操作顺序应为设置调试文件目录文件)。我认为您可以修改您的构建/调试过程,以便将 gdb 包装脚本与 gdb 命令脚本一起使用(与 .gdbinit 相同,但例如将其称为 start.gdb 以避免混淆):

gdb_x:
#!/bin/sh
gdb -x ./start.gdb "$@"

start.gdb:
# this file is generated for .. by ...
set debug-file-directory <>
set debug-file-directory <>

或者,作为一种解决方法,如果您可以接受命令将运行两次的事实:

gdb -x ./.gdbinit <>

这可以避免(并且值得再次包装脚本):

gdb -iex "set auto-load local-gdbinit off" -x ./.gdbinit <>

【讨论】:

我放弃了。我会将项目的所有调试文件分组到一个目录中并编辑全局.gdbinit。这是每个项目的配置,但至少不会让人们感到困惑。

以上是关于设置调试文件目录后再次搜索符号的主要内容,如果未能解决你的问题,请参考以下文章

GDB调试

windbg符号加载和调试

设置vscode 显示当前文件完整目录

如何在Linux系统上显示当前及子目录中的文件数量

获取pe文件调试符号文件pdb路径

GDB使用——pwn相关