好的,info break列出了断点,但是没有使用--command as in this question重用它们的格式。 gdb是否有一种方法可以将它们转储到可接受输入的文件中?有时在调试会话中,有必要在构建一组断点进行测试后重新启动gdb。
编辑: .gdbinit文件与--command存在同样的问题。 info break命令不列出命令,而是列出供人消费的表。
详细说明,以下是来自info break的示例:
(gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x08048517 <foo::bar(void)+7>
答案 0 :(得分:188)
从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.
使用source <filename>
从文件中恢复已保存的断点。
答案 1 :(得分:25)
这个答案已经过时,gdb现在支持直接保存。请参阅this answer。
您可以使用日志记录:
(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
答案 2 :(得分:11)
将gdb命令和断点放在.gdbinit文件中,就像在gdb&gt;中键入它们一样。提示,gdb将在启动时自动加载并运行它们。这是一个每个目录的文件,因此您可以为不同的项目提供不同的文件。
答案 3 :(得分:9)
anon延伸到约翰内斯回答的延伸:
.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
保存的断点。
答案 4 :(得分:6)
扩展到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
当使用-g
编译应用程序时,这对我有用。
编辑:在Ubuntu Karmic上使用gdb v6.8成功测试。
答案 5 :(得分:3)
答案 6 :(得分:3)
将以下内容放在〜/ .gdbinit中,将 bsave 和 brestore 定义为gdb命令,以保存和恢复断点。
define bsave
save breakpoints ~/.breakpoints
end
define brestore
source ~/.breakpoints
end
答案 7 :(得分:1)
警告:当前输出协议 不支持重定向
尝试在TUI模式下启用日志记录时,我也在GDB中收到此错误/警告,但是在“非TUI”模式下,日志记录似乎有效。因此,每当我想记录某些内容时,我都会离开TUI模式。 (使用 CTRL-X , CTRL-A 来回切换到TUI模式。)
以下是我的工作方式:
set logging on
- 现在不应该抱怨。希望这有帮助, / M:O)
答案 8 :(得分:1)
我知道这是一个旧帖子,但它出现在我的谷歌搜索中,以帮助我做到这一点。我是gdb的新手,发现上面的答案中增加了以下内容,可以将断点保存/加载到特定文件。
如上所述,将以下代码添加到文件〜/ .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
答案 9 :(得分:0)
问题是设置断点是上下文敏感的。 如果你有两个名为foo的静态函数怎么办?如果你是 已经调试了一个定义foo的模块 gdb会假设你的意思是那个。但如果你只是转储 “break foo”进入文件,然后在启动时读取该文件, 你不清楚你的意思是什么功能。
答案 10 :(得分:0)
还有其他想法吗?我有
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
答案 11 :(得分:0)
问题是设置断点是上下文敏感的。如果 你有两个名为foo的静态函数?如果您已经在调试 其中一个定义foo的模块,然后gdb会假设你的意思 那个。但是如果你只是将“break foo”转储到一个文件然后阅读 该文件在启动时,不清楚哪个函数对你有用 的意思。
我没有要回复的mod点,但你要做的是通过指定源文件和行号来明确断点。 如果在foo.c:42和bar.c:1337中指定了foo()
break foo.c:42
break bar.c:1337
或者,指定仅在程序在gdb下运行时才触发的源内断点。见How to detect if the current process is being run by GDB?