让gdb保存一个断点列表?

好的,信息中断列出了断点,但不是以一种格式来处理, 就像在这个问题中一样使用–command重用它们。 gdb是否有方法将它们转储到一个可接受的input文件中? 有时在debugging会话中,build立一组testing断点之后,有必要重新启动gdb。

编辑: .gdbinit文件与–command有相同的问题。 info break命令不会列出命令,而是一个供人类使用的表格。

详细来说,这里是一个信息中断的例子:

 (gdb)信息中断
 Num Type Disp Enb Address什么
 1断点保持y 0x08048517 <foo :: bar(void)+7>

从gdb 7.2开始,现在可以使用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. 

这个答案已经过时了,gdb现在支持直接保存。 看到这个答案 。

您可以使用日志logging:

 (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文件有用的格式很简单。 或者你甚至可以使脚本发出单独的--eval-command的gdb命令行…

将这个小macros添加到.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 

把你的gdb命令和断点放在一个.gdbinit文件中,就像你可以在gdb>提示符下键入它们一样,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 define brestore source brestore.gdb end document brestore restore breakpoints saved by bsave end 

随着brestore你可以恢复与bsave保存的断点。

对Johannes答案的扩展:您可以自动将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有一个有效的命令brestore.gdb

当应用程序使用-g编译时,这对我-g

编辑 :成功与Ubuntu的Karmic gdb v6.8testing。

把〜/ .gdbinit中的以下内容作为gdb命令定义bsavebrestore来保存和恢复断点。

 define bsave save breakpoints ~/.breakpoints end define brestore source ~/.breakpoints end 

警告:当前输出协议不支持redirect

当在TUI模式下启用日志logging时,我也会在GDB中得到这个错误/警告,但是在“非TUI”模式下,日志似乎工作。 所以,当我想logging某些东西时,我就离开TUI模式。 (用CTRL-XCTRL-A来回切换到TUI模式)。

以下是我的工作方式:

  1. 启动GDB(在正常模式下)
  2. 启用日志logging: set logging on – 现在它不应该抱怨。
  3. 切换回TUI模式,做GDB的东西
  4. 当我想logging一些东西(比如一个巨大的追踪转储)时,切换到正常模式

希望这有助于/ M:o)

我知道这是一个古老的线程,但它出现在我的谷歌search,以帮助我这样做。 我是gdb新手,发现上面的答案除了有助于将断点保存/加载到特定文件之外。

  • 保存断点: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 

问题是设置一个断点是上下文敏感的。 如果你有两个名为foo的静态函数呢? 如果你已经在debugging其中一个定义foo的模块,那么gdb会假设你是这个模块的。 但是如果你只是把“break foo”转储到一个文件中,然后在启动时读取这个文件,那么你将不清楚你的意思是哪个函数。

任何其他的想法? 我有

 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 

问题是设置一个断点是上下文敏感的。 如果你有两个名为foo的静态函数呢? 如果你已经在debugging其中一个定义foo的模块,那么gdb会假设你是这个模块的。 但是如果你只是把“break foo”转储到一个文件中,然后在启动时读取这个文件,那么你将不清楚你的意思是哪个函数。

我没有mod点回复,但是你要做的是通过指定源文件和行号来明确你的断点。 如果在foo.c:42和bar.c:1337中都指定了foo()

 break foo.c:42 break bar.c:1337 

或者,指定仅在程序在gdb下运行时触发的源内断点。 请参阅如何检测当前进程是否由GDB运行?