c - 无法从 .gdbinit 获取文件源

标签 c gdb breakpoints gdbinit

我有一个包含 GDB 断点的文件 ~/.gdb_bps。我使用 save Breakpoints .gdb_bps 生成了此文件。我试图在 GDB 启动时通过将此行添加到 ~/.gdbinit 来获取此文件:

source .gdb_bps

当我启动 GDB 时,出现错误:

No symbol table is loaded.  Use the "file" command.
Make breakpoint pending on future shared library load? (y or [n]) [answered N; input not from terminal]

但是 GDB session 期间的采购工作按预期进行:

(gdb) source .gdb_bps
Breakpoint 1 at 0x401227: file test/varargs2_test.c, line 22.
Breakpoint 2 at 0x4012a3: file test/varargs2_test.c, line 27.
Breakpoint 3 at 0x40117b: file test/varargs2_test.c, line 9.
Breakpoint 4 at 0x401256: file test/varargs2_test.c, line 25.

我的问题是为什么 source .gdb_bps~/.gdbinit 中使用它时会出错?

最佳答案

~/.gdbinit 在处理命令行中的目标文件之前运行。

虽然需要一些设置,但将断点保存为 gdb 脚本,可以是 auto-loaded可能是最干净的方法。

首先,创建一个目录来保存脚本,并将相应的行添加到 ~/.gdbinit 中。

~/devel$ mkdir ~/gdbscripts
~/devel$ cat ~/.gdbinit
add-auto-load-safe-path /home/mp/gdbscripts
add-auto-load-scripts-directory /home/mp/gdbscripts
set debug auto-load on

一切正常后,我们将删除最后一行。

现在让我们看看 gdb 在哪里查找其脚本文件。

~/devel$ gdb -q sigw
Reading symbols from sigw...done.
auto-load: Attempted file "/home/mp/devel/sigw-gdb.gdb" does not exist.
auto-load: Expanded $-variables to "/usr/lib/debug:/usr/share/gdb/auto-load:/home/mp/gdbscripts".
auto-load: Searching 'set auto-load scripts-directory' path "$debugdir:$datadir/auto-load:/home/mp/gdbscripts".
auto-load: Attempted file "/usr/lib/debug/home/mp/devel/sigw-gdb.gdb" does not exist.
auto-load: Attempted file "/usr/share/gdb/auto-load/home/mp/devel/sigw-gdb.gdb" does not exist.
auto-load: Attempted file "/home/mp/gdbscripts/home/mp/devel/sigw-gdb.gdb" does not exist.
auto-load: Attempted file "/home/mp/devel/sigw-gdb.py" does not exist.
auto-load: Expanded $-variables to "/usr/lib/debug:/usr/share/gdb/auto-load:/home/mp/gdbscripts".
auto-load: Searching 'set auto-load scripts-directory' path "$debugdir:$datadir/auto-load:/home/mp/gdbscripts".
auto-load: Attempted file "/usr/lib/debug/home/mp/devel/sigw-gdb.py" does not exist.
auto-load: Attempted file "/usr/share/gdb/auto-load/home/mp/devel/sigw-gdb.py" does not exist.
auto-load: Attempted file "/home/mp/gdbscripts/home/mp/devel/sigw-gdb.py" does not exist.

那里有一些不错的候选者,其中一些只能由 root 写入,而另一些则需要添加到安全路径中。让我们使用~/gdbscripts/$PWD/sigw-gdb.gdb

(gdb) shell mkdir -p ~/gdbscripts/$PWD
(gdb) b main
Breakpoint 1 at 0x84f: file sigw.c, line 15.
(gdb) save breakpoints ~/gdbscripts/$PWD/sigw-gdb.gdb
Unable to open file '/home/mp/gdbscripts/$PWD/sigw-gdb.gdb' for saving (No such file or directory)

看起来 save 命令扩展了 ~ 但没有扩展环境变量。我们必须使用完整路径。

(gdb) save breakpoints ~/gdbscripts/home/mp/devel/sigw-gdb.gdb
Saved to file '/home/mp/gdbscripts/home/mp/devel/sigw-gdb.gdb'.

测试一下。

(gdb) quit
~/devel$ gdb -q sigw
Reading symbols from sigw...done.
...
auto-load: Matching file "/home/mp/gdbscripts/home/mp/devel/sigw-gdb.gdb" to pattern "/home/mp/gdbscripts"
auto-load: Matched - file "/home/mp/gdbscripts" to pattern "/home/mp/gdbscripts".
auto-load: File "/home/mp/gdbscripts/home/mp/devel/sigw-gdb.gdb" matches directory "/home/mp/gdbscripts".
Breakpoint 1 at 0x84f: file sigw.c, line 15.
...
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000000084f in main at sigw.c:15

关于c - 无法从 .gdbinit 获取文件源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59317297/

相关文章:

c - 如何设置 KDevelop 才能正确使用 gcc 编译代码?

linux - 让 gdb 使用更少的内存

css - 如何为响应式 CSS 找出合适的最小宽度和最大宽度值?

visual-studio - 更改了全局变量,但未命中内存断点

c - 我怎样才能改写它而改用 char 数组?

c - 使用 C 中的结构将数据存储到动态数组中

c - 在 python 中调试 c 扩展

ios - 每次应用程序启动时,都会从 "_GLOBAL__I_a"触发 "ImageLoaderMachO::doModInitFunctions"异常中断

python - `gcc`哪个版本支持 `--no-undefined`开关?

c - GCC:在每条指令之后强制调用函数(用于多线程测试)?