141

好的,info break列出了断点,但不是以一种可以很好地使用 --command 重用它们的格式,如在这个问题中。GDB 是否有一种方法可以将它们转储到可以再次输入的文件中?有时在调试会话中,需要在建立一组断点后重新启动 GDB 以进行测试。

.gdbinit 文件与 --command 有相同的问题。info break命令没有列出命令,而是一个供人类使用的表格。

详细地说,这里是info break的一个示例:

(gdb) 信息中断
Num 类型 Disp Enb 地址 什么
1个断点保持y 0x08048517 <foo::bar(void)+7>
4

11 回答 11

224

从 GDB 7.2 (2011-08-23) 开始,您现在可以使用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>从文件中恢复保存的断点。

于 2010-10-21T03:51:19.677 回答
27

这个答案已经过时了。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文件有用的格式很容易。或者你甚至可以让脚本--eval-command向 GDB 命令行发出单独的 's ......

将这个小宏添加到.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
于 2009-02-01T20:39:38.067 回答
11

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

于 2009-02-01T20:18:57.657 回答
9

anonJohannes 的回答的扩展:

.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.

于 2010-05-27T13:35:37.083 回答
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 9.10 (Karmic Koala) 上使用 GDB v6.8 成功测试了它。

于 2010-02-09T23:03:09.530 回答
4

将以下内容放入~/.gdbinit以将bsavebrestore定义为 GDB 命令以保存和恢复断点。

define bsave
    save breakpoints ~/.breakpoints
end

define brestore
   source ~/.breakpoints
end
于 2013-08-27T08:00:58.197 回答
3

也许是这样:

save breakpoints [filename]

于 2010-07-19T14:10:45.797 回答
2

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

  • 保存断点: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
于 2016-10-04T10:57:41.150 回答
1

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

尝试在TUI模式下启用日志记录时,我也在 GDB 中收到此错误/警告。但是,日志记录似乎在“非 TUI”模式下工作。所以每当我想记录一些东西时,我都会离开 TUI 模式。Ctrl(使用+XCtrl+A来回切换到 TUI 模式)。

这是我的工作方式:

  1. 启动 GDB(在正常模式下)
  2. 启用日志记录:set logging on- 现在它不应该抱怨了。
  3. 来回切换到 TUI 模式并执行 GDB 操作
  4. 每当我想记录一些东西(比如一个巨大的回溯转储)时——切换到正常模式
于 2010-08-09T12:14:11.150 回答
0

问题是设置断点是上下文相关的。如果您有两个名为foo的静态函数怎么办?

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

于 2009-10-28T20:52:07.387 回答
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
于 2010-07-01T15:14:01.227 回答