This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: General regressions in gdbserver mode [Re: [rfc target-side break conditions 0/5 v2] General info]
On 02/25/2012 03:06 PM, Jan Kratochvil wrote:
On Sat, 25 Feb 2012 16:39:55 +0100, Luis Gustavo wrote:
What kind of setup you're using?
Fedora 17 x86_64. It does not crash for me without -lmcheck but it does crash
for gdbserver linked with -lmcheck, gdbserver dumps core then.
With valgrind gdbserver prints:
Invalid read of size 8
at: clear_gdb_breakpoint_conditions (mem-break.c:741)
by: delete_gdb_breakpoint_at (mem-break.c:715)
by: x86_remove_point (linux-x86-low.c:593)
by: linux_remove_point (linux-low.c:4463)
by: process_serial_event (server.c:3207)
by: handle_serial_event (server.c:3340)
by: handle_file_event (event-loop.c:489)
by: process_event (event-loop.c:244)
by: start_event_loop (event-loop.c:607)
by: main (server.c:2773)
Address 0x56242c8 is 8 bytes inside a block of size 16 free'd
at: free (vg_replace_malloc.c:427)
by: clear_gdb_breakpoint_conditions (mem-break.c:740)
by: delete_gdb_breakpoint_at (mem-break.c:715)
by: x86_remove_point (linux-x86-low.c:593)
by: linux_remove_point (linux-low.c:4463)
by: process_serial_event (server.c:3207)
by: handle_serial_event (server.c:3340)
by: handle_file_event (event-loop.c:489)
by: process_event (event-loop.c:244)
by: start_event_loop (event-loop.c:607)
by: main (server.c:2773)
Thanks,
Jan
Could please try the following on your side?
I reproduced the crash with -lmcheck and this patch fixed it for me.
Thanks,
Luis
2012-02-25 Luis Machado <lgustavo@codesourcery.com>
* mem-break.c (clear_gdb_breakpoint_conditions): Fix de-allocation
of conditions.
diff --git a/gdb/gdbserver/mem-break.c b/gdb/gdbserver/mem-break.c
index c9a6035..69265cb 100644
--- a/gdb/gdbserver/mem-break.c
+++ b/gdb/gdbserver/mem-break.c
@@ -726,20 +726,19 @@ void
clear_gdb_breakpoint_conditions (CORE_ADDR addr)
{
struct breakpoint *bp = find_gdb_breakpoint_at (addr);
- struct point_cond_list *cond, **cond_p;
+ struct point_cond_list *cond, *cond_next;
if (bp == NULL || bp->cond_list == NULL)
return;
cond = bp->cond_list;
- cond_p = &bp->cond_list->next;
while (cond != NULL)
{
+ cond_next = cond->next;
free (cond->cond);
free (cond);
- cond = *cond_p;
- cond_p = &cond->next;
+ cond = cond_next;
}
bp->cond_list = NULL;