Multiple locations and breakpoints confusion.

Pedro Alves palves@redhat.com
Tue May 1 19:32:00 GMT 2018


On 05/01/2018 09:15 AM, Phil Muldoon wrote:

> 
> And indeed that breakpoint is not enabled. If I disable the "parent" breakpoint:
> 
> (gdb) disable 1
> (gdb) info breakpoints
> Num     Type           Disp Enb Address            What
> 1       breakpoint     keep n   <MULTIPLE>         
> 1.1                         n     0x00000000004004b3 in multiple_test::foo(int) at multiple.cpp:10
> 1.2                         y     0x00000000004004c3 in multiple_test::foo(double) at multiple.cpp:15
> 
> It shows 1 as disabled but 1.2 as enabled. That seems wrong to me. In
> fact, all of the breakpoints are disabled as evidenced by:
> 
> (gdb) r
> Starting program: /home/pmuldoon/outgoing/multiple
> [Inferior 1 (process 17661) exited normally]
> (gdb)

IMO, it's working as intended.  A location's actual
enablement is determined by:

  is_enabled(bp) && is_enabled(bp.location)

That's basically what the code does, in breakpoint.c:should_be_inserted.

The advantage IMO is that this way, when you re-enable the (parent)
breakpoint, you don't have to re-disable the individual bp locations
that you don't care about, again, because gdb remembers the
enable/disabled status of the individual bp locations.

> 
> So in recreating multiple location management in Python, I'm a bit
> confused if disabling the parent breakpoint should disable all
> locations and there's a display buglet on "info breakpoints", or if
> the "info breakpoints" output is correct and there's a breakpoint
> buglet regarding the disabling of breakpoints?

IMO, it's working as intended.

Maybe it'd help if we would come up with some concise
way to display a location as enabled-but-note-parent-is-disabled
differently, like with a different letter or some extra character
or something like that.  A couple ideas:

 1       breakpoint     keep y   <MULTIPLE>         
 1.1                         y.n   0x00000000004004b3 in multiple_test::foo(int) at multiple.cpp:10
 1.2                         y.y   0x00000000004004c3 in multiple_test::foo(double) at multiple.cpp:15

 1       breakpoint     keep n   <MULTIPLE>         
 1.1                         n.n   0x00000000004004b3 in multiple_test::foo(int) at multiple.cpp:10
 1.2                         n.y   0x00000000004004c3 in multiple_test::foo(double) at multiple.cpp:15

or:

 1       breakpoint     keep y   <MULTIPLE>         
 1.1                         n     0x00000000004004b3 in multiple_test::foo(int) at multiple.cpp:10
 1.2                         y     0x00000000004004c3 in multiple_test::foo(double) at multiple.cpp:15

 1       breakpoint     keep n   <MULTIPLE>         
 1.1                         (y)   0x00000000004004b3 in multiple_test::foo(int) at multiple.cpp:10
 1.2                         (n)   0x00000000004004c3 in multiple_test::foo(double) at multiple.cpp:15

I think I kind of like the second better, though not sure if it
helps more than it confuses.

In any case, the relevant sections in the manual could
use some clarification.

Thanks,
Pedro Alves



More information about the Gdb mailing list