让gdb保存断点列表?

时间:2009-02-01 20:09:19

标签: c++ c debugging gdb breakpoints

好的,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>

12 个答案:

答案 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模式。)

以下是我的工作方式:

  1. 启动GDB(正常模式)
  2. 启用日志记录:set logging on - 现在不应该抱怨。
  3. 来回切换到TUI模式并执行GDB内容
  4. 当我想记录某些东西时(比如一个巨大的回溯转储) - 切换到普通模式
  5. 希望这有帮助, / M:O)

答案 8 :(得分:1)

我知道这是一个旧帖子,但它出现在我的谷歌搜索中,以帮助我做到这一点。我是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

答案 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?