11

在 GDB 调试 C++ 代码中:我策略性地设置了 15 个断点,但我不希望它们中的任何一个在我遇到断点 #2 之前激活。GDB中有run-until-breakpoint- n命令吗?

我发现自己在做两件事之一:

  1. 删除所有其他断点,以便 #2 是所有存在的,运行,重新添加所有断点;或者

  2. 跑步并反复continue经过所有休息时间,直到我在 #2 看到第一个休息时间。

我想要这样的东西run-until 2会忽略除#2之外的所有其他断点,但不会删除它们。这存在吗?还有其他人有更好的方法来处理这个吗?

4

4 回答 4

11

您可以设置断点,enable并且disable这些命令将接受一个范围。在程序执行过程中,在战略点使用这些命令和一个范围。

我假设当您提到断点#2时,您指的是断点的 gdb 编号。这是一个简单的 gdb 会话示例:

(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep y   0x00001e15 in main at example.c:40
(gdb) disable 1-3
(gdb) enable 2
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep n   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep n   0x00001e15 in main at example.c:40
(gdb) 

现在只启用断点#2。运行程序,当执行在 #2 处中断时,重新启用所有所需的断点,范围为:

(gdb) enable 1-3
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep y   0x00001e15 in main at example.c:40

您还可以混合断点编号和范围:

(gdb) disable 1 4 6-7
(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep n   0x00001ddb in main at example.c:34
2   breakpoint     keep y   0x00001e00 in main at example.c:39
3   breakpoint     keep y   0x00001e15 in main at example.c:40
4   breakpoint     keep n   0x00001e4f in main at example.c:43
5   breakpoint     keep y   0x00001e4f in main at example.c:44
6   breakpoint     keep n   0x00001e5e in main at example.c:45
7   breakpoint     keep n   0x00001e5e in main at example.c:46
于 2012-08-22T23:08:42.237 回答
11

从 7.0 版开始,GDB 支持 python 脚本。我编写了一个简单的脚本,它将暂时禁用所有启用的断点,除了具有指定编号的断点并执行 GDBrun命令。

将以下代码添加到.gdbinit文件中:

python
import gdb

class RunUntilCommand(gdb.Command):
    """Run until breakpoint and temporary disable other ones"""

    def __init__ (self):
        super(RunUntilCommand, self).__init__ ("run-until",
                                               gdb.COMMAND_BREAKPOINTS)

    def invoke(self, bp_num, from_tty):
        try:
            bp_num = int(bp_num)
        except (TypeError, ValueError):
            print "Enter breakpoint number as argument."
            return

        all_breakpoints = gdb.breakpoints() or []
        breakpoints = [b for b in all_breakpoints
                       if b.is_valid() and b.enabled and b.number != bp_num and
                       b.visible == gdb.BP_BREAKPOINT]

        for b in breakpoints:
            b.enabled = False

        gdb.execute("run")

        for b in breakpoints:
            b.enabled = True

RunUntilCommand()
end
于 2012-08-22T23:22:24.840 回答
3

对他们来说,比删除所有其他断点要少一些痛苦disable。这样您就不必重新输入与断点相关的所有内容来将其恢复,只需enable按数字再次输入即可。

于 2012-08-22T21:31:04.587 回答
2

gdb可以禁用断点而不是删除断点。然后,您所要做的就是在需要时重新启用它们。

于 2012-08-22T21:31:26.137 回答