让 GDB 保存断点列表

好的,一个 href = “ https://sourceware.org/gdb/onlinedocs/gdb/Set-Breaks.html”rel = “ noReferrer”> info break 列出了断点,但是格式不适合使用——命令 就像这个问题一样重用它们。GDB 是否有方法将它们转储到一个可以再次输入的文件中?有时在调试会话中,需要在构建一组用于测试的断点之后重新启动 GDB。

那个。Gdbinit 文件的问题与—— command 相同。信息突破命令不列出命令,而是一个供人使用的表。

为了详细说明,这里有一个来自 信息突破的例子:

(gdb) info break
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048517 <foo::bar(void)+7>
50719 次浏览

将您的 GDB 命令和断点放在 . gdbinit 文件中,就像您在 gdb>提示符下键入它们一样,GDB 将在启动时自动加载并运行它们。这是一个每个目录的文件,因此您可以为不同的项目提供不同的文件。

这个答案已经过时了。 GDB 现在支持直接保存。参见 这个答案

您可以使用日志记录:

(gdb) b main
Breakpoint 1 at 0x8049329
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) set logging file breaks.txt
(gdb) set logging on
Copying output to breaks.txt.
(gdb) info break
Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>
(gdb) q

文件 breaks.txt 现在包含:

Num     Type           Disp Enb Address    What
1       breakpoint     keep y   0x08049329 <main+16>

编写一个 AWK 脚本,将其转换成对 .gdbinit--command文件有用的格式很容易。或者您甚至可以让脚本向 GDB 命令行发出单独的 --eval-command..。

将这个小宏添加到 。 gdbinit将有助于您完成这项工作:

# Call with dump_breaks file.txt
define dump_breaks
set logging file $arg0
set logging redirect on
set logging on
info breakpoints
set logging off
set logging redirect off
end

问题是设置断点是上下文敏感的。 如果有两个名为 的静态函数会怎样?

如果您已经在调试定义 foo 的模块之一,那么 GDB 会以为你说的是那个。但是,如果您只是将“ break foo”转储到一个文件中,然后在启动时读取该文件,则不会清楚您指的是哪个函数

扩展到 约翰内斯的回答: 您可以自动将 info break的输出重新格式化为一个有效的 GDB 命令文件:

.gdbinit:


define bsave
shell rm -f brestore.txt
set logging file brestore.txt
set logging on
info break
set logging off
# Reformat on-the-fly to a valid gdb command file
shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
store actual breakpoints
end

然后在 brestore.gdb中有一个有效的命令文件。

当使用 -g编译应用程序时,这对我来说是有效的。

我还在 Ubuntu 9.10(Karmic Koala)上用 GDB v6.8成功地测试了它。

匿名的分机延伸至 约翰内斯的回答:

.gdbinit:


define bsave
shell rm -f brestore.txt
set logging file brestore.txt
set logging on
info break
set logging off
# Reformat on-the-fly to a valid GDB command file
shell perl -n -e 'print "break $1\n" if /^\d+.+?(\S+)$/g' brestore.txt > brestore.gdb
end
document bsave
store actual breakpoints
end


define brestore
source brestore.gdb
end
document brestore
restore breakpoints saved by bsave
end

然后,使用 brestore可以恢复用 bsave保存的断点。

还有别的办法吗? 我有

warning: Current output protocol does not support redirection

之后

set logging on

编辑:

我知道这个问题是“如何保存断点列表”,但是我刚刚发现,使用 GDB 我们可以简单地设置“保存在文件中”的断点

gdb> source breakpoints.txt

其中 breakpoints.txt是这样一个文件:

break main.cpp:25
break engine.cpp:465
break wheel.cpp:57

警告: 当前输出协议 不支持重定向

在 GDB 中尝试启用 途易模式下的日志记录时,也会得到这个错误/警告。但是,当处于“非 TUI”模式时,日志记录似乎可以正常工作。因此,只要我想记录某些内容,我就会离开 TUI 模式。(用 ABC0 + XABC0 + A来回切换到 TUI 模式)。

我是这样工作的:

  1. 启动 GDB (正常模式)
  2. 启用日志记录: set logging on-现在它不应该抱怨。
  3. 切换到 TUI 模式,做 GDB 的事情
  4. 每当我想记录一些东西(像一个巨大的回溯转储)-切换到正常模式

从 GDB 7.2(2011-08-23)开始,您现在可以使用 一个 href = “ https://sourceware.org/gdb/onlinedocs/gdb/Save-Breakpoints.html”rel = “ noReferrer”> save breakpoints 命令。

save breakpoints <filename>
Save all current breakpoint definitions to a file suitable for use
in a later debugging session.  To read the saved breakpoint
definitions, use the `source' command.

使用 source <filename>从文件中还原保存的断点。

~/. gdbinit中放入以下命令,将 BSaveBrestore定义为 GDB 命令,以保存和恢复断点。

define bsave
save breakpoints ~/.breakpoints
end


define brestore
source ~/.breakpoints
end

我发现以下对前一个答案的补充对于将断点保存/加载到特定文件非常有用。

  • 保存断点: bsave { filename }
  • 加载断点: bload { filename }

与前一个答案一样,将以下代码添加到文件 ~/. gdbinit 中

# Save breakpoints to a file
define bsave
if $argc != 1
help bsave
else
save breakpoints $arg0
end
end
document bsave
Saves all current defined breakpoints to the defined file in the PWD
Usage: bsave <filename>
end


# Loads breakpoints from a file
define bload
if $argc != 1
help bload
else
source $arg0
end
end
document bload
Loads all breakpoints from the defined file in the PWD
Usage: bload <filename>
end