设置调试文件目录后再次搜索符号
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
。这是每个项目的配置,但至少不会让人们感到困惑。以上是关于设置调试文件目录后再次搜索符号的主要内容,如果未能解决你的问题,请参考以下文章