GDB:运行直到特定断点

12
在GDB调试C++代码时,我有15个策略性设置的断点,但在打中断点#2之前,我不想激活任何一个断点。是否有run-until-breakpoint-n的命令在GDB中?
我发现自己做了以下两件事之一:
1.删除其他所有断点,以便只剩下#2,运行,重新添加所有断点;或
2.运行并反复继续通过所有断点,直到看到#2的第一个断点。
我希望有类似于run-until 2这样的东西,它将忽略除#2之外的所有其他断点,但不会删除它们。这个功能存在吗?还有其他人有更好的方法来处理这个问题吗?
4个回答

11

您可以启用禁用断点,这些命令将接受一个范围。在程序执行的关键点使用这些带有范围的命令。

我假设当您提到断点#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

谢谢pb2q,我不知道启用和禁用的事情。 - sligocki
我正在使用Qt Creator中的gdb。断点ID在调试会话中是否一致?我经常需要修复应用程序中的某些问题,重新编译,再次调试等等。 - Charles

11

从7.0版本开始,GDB支持Python脚本。我编写了一个简单的脚本,可以临时禁用除指定编号之外的所有已启用断点,并执行GDB的run命令。

将以下代码添加到.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

这很棒。continue-until 版本可能会更有用。 - Ciro Santilli OurBigBook.com

3
稍微比删除其他断点要好的方法是将它们禁用。这样,您就不必重新输入与断点相关联的所有内容才能将其恢复,只需按编号启用即可。

2

使用gdb,可以禁用断点而不是删除它们。需要时只需重新启用即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接