11
votes

In GDB debugging C++ code: I have 15 breakpoints strategically set, but I don't want any of them to activate until I've hit breakpoint #2. Is there any run-until-breakpoint-n command in GDB?

I find myself doing one of two things instead:

  1. Delete all other breakpoints so that #2 is all that exists, run, re-add all breakpoints; or

  2. Run and repeatedly continue past all breaks until I see the first break at #2.

I want something like run-until 2 that will ignore all other breakpoints except #2, but not delete them. Does this exist? Does anyone else have a better way to deal with this?

4

4 Answers

11
votes

As of version 7.0 GDB supports python scripting. I wrote a simple script that will temporary disable all enabled breakpoints except the one with specified number and execute GDB run command.

Add the following code to the .gdbinit file:

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
11
votes

You can enable and disable breakpoints, and these commands will accept a range. Use these commands, with a range, at strategic points during the execution of the program.

I assume that when you mention breakpoint #2 you're referring to the gdb numbering of breakpoints. Here is a simple example gdb session:

(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) 

Now only breakpoint #2 is enabled. Run the program and when execution breaks at #2, re-enable all of your desired breakpoints with a range:

(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

You can also mix breakpoint numbers and ranges:

(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
3
votes

Slightly less painful than deleting all the other breakpoints would be to disable them. That way you don't have to reenter all the stuff associated with the breakpoint to bring it back, just enable it again by number.

2
votes

With gdb breakpoints can be disabled instead of deleted. Then all you have to do is reenable them when needed.