Re: gdb 5.2 removes the conditional breakpoints

H . J . Lu
2002-04-17T23:57:59Z

On Wed, Apr 10, 2002 at 10:52:51AM +0300, Michael Veksler wrote:
> /References/: <20020322095020.A12445@lucon.org
> <http://sources.redhat.com/ml/gdb/2002-03/msg00196.html> >
> <3C9B76F5.6050809@cygnus.com
> <http://sources.redhat.com/ml/gdb/2002-03/msg00198.html> >
>
>
> On Fri, Mar 22, 2002 at 01:24:53PM -0500, Andrew Cagney wrote:
> > > When I do
> > >
> > > (gdb) b 100
> > > (gdb) cond 1 i == 3
> > > (gdb) r
> > > (gdb) r
> > >
> > > gdb 5.2 will remove the conditional breakpoints on Linux/x86 after I
> > > restart the debug session. Am I the only one who sees it?
> >
> > It would be very helpful if you could illustrate this problem by
> > submitting a real testcase. That way people can run it and check
> > before/after effects on various platforms and GDB releases.
> >
>
> Here are the instructions for reproducing this annoying problem:
>
> // Debugged source:
> typedef int operation(int val);
>
> int f(operation * op, int value)
> {
> return op(value);
> }
>
> int nop(int val)
> {
> return val;
> }
>
> int main()
> {
> return f(nop, 5);
> }
> // End source
>
> Compile it on Linux using gcc 3.0.4 or redhat's 2.96 (did not test it
> on other versions).
> (gdb) b main
> (gdb) r
> Breakpoint 1, main () at t.c:15
> 15 return f(nop, 5);
> (gdb) s
> f (op=0x8048448 <nop>, value=5) at t.c:5
> 5 return op(value);
> (gdb) b
> Breakpoint 2 at 0x8048432: file t.c, line 5.

Thanks for the testcase. Basically, we deleted all break points set
with "break" when we restart. It is a very bad regression from gdb
4.17. Here is a patch. May I check it into gdb 5.2?

Thanks.

H.J.
----
2002-04-17 H.J. Lu (hjl@gnu.org)

* breakpoint.c (create_thread_event_breakpoint): Use xasprintf.
(create_breakpoints): Make sure the addr_string field is not
NULL.

--- gdb/breakpoint.c.break Wed Mar 6 22:30:42 2002
+++ gdb/breakpoint.c Wed Apr 17 16:50:18 2002
@@ -3859,14 +3859,12 @@ struct breakpoint *
create_thread_event_breakpoint (CORE_ADDR address)
{
struct breakpoint *b;
- char addr_string[80]; /* Surely an addr can't be longer than that. */

b = create_internal_breakpoint (address, bp_thread_event);

b->enable_state = bp_enabled;
/* addr_string has to be used or breakpoint_re_set will delete me. */
- sprintf (addr_string, "*0x%s", paddr (b->address));
- b->addr_string = xstrdup (addr_string);
+ xasprintf (&b->addr_string, "*0x%s", paddr (b->address));

return b;
}
@@ -4422,7 +4420,10 @@ create_breakpoints (struct symtabs_and_l
b->number = breakpoint_count;
b->cond = cond[i];
b->thread = thread;
- b->addr_string = addr_string[i];
+ if (addr_string[i])
+ b->addr_string = addr_string[i];
+ else
+ xasprintf (&b->addr_string, "%s:%d", b->source_file, b->line_number);
b->cond_string = cond_string[i];
b->ignore_count = ignore_count;
b->enable_state = bp_enabled;