[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [6095] User-mode GDB stub improvements - handle fork
From: |
Martin Mohring |
Subject: |
Re: [Qemu-devel] [6095] User-mode GDB stub improvements - handle fork |
Date: |
Tue, 06 Jan 2009 20:08:52 +0100 |
User-agent: |
Thunderbird 2.0.0.18 (X11/20081112) |
Martin Mohring wrote:
> I seem to have found the cause, why ARM user mode with nptl does not
> work as before. see below.
>
> Martin
>
> Aurelien Jarno wrote:
>
>> Revision: 6095
>> http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6095
>> Author: aurel32
>> Date: 2008-12-18 22:44:04 +0000 (Thu, 18 Dec 2008)
>>
>> Log Message:
>> -----------
>> User-mode GDB stub improvements - handle fork
>>
>> Close gdbserver in child processes, so that only one stub tries to talk
>> to GDB at a time. Updated from an earlier patch by Paul Brook.
>>
>> Signed-off-by: Daniel Jacobowitz <address@hidden>
>> Signed-off-by: Aurelien Jarno <address@hidden>
>>
>> Modified Paths:
>> --------------
>> trunk/gdbstub.c
>> trunk/gdbstub.h
>> trunk/linux-user/main.c
>> trunk/linux-user/syscall.c
>>
>> Modified: trunk/gdbstub.c
>> ===================================================================
>> --- trunk/gdbstub.c 2008-12-18 22:43:56 UTC (rev 6094)
>> +++ trunk/gdbstub.c 2008-12-18 22:44:04 UTC (rev 6095)
>> @@ -1996,6 +1996,18 @@
>> gdb_accept();
>> return 0;
>> }
>> +
>> +/* Disable gdb stub for child processes. */
>> +void gdbserver_fork(CPUState *env)
>> +{
>> + GDBState *s = gdbserver_state;
>> + if (s->fd < 0)
>> + return;
>> + close(s->fd);
>> + s->fd = -1;
>> + cpu_breakpoint_remove_all(env, BP_GDB);
>> + cpu_watchpoint_remove_all(env, BP_GDB);
>> +}
>>
>>
> In case of USE_NPTL is defined, it seems that either s or env can be
> NULL, so I get a exception (yes, nptl works on arm in user mode).
> My understanding is that this might be a race condition of the first
> fork() call coming even before env or gdbserver_state is initialised
> towards !NULL.
>
The reason why I wrote this and did not propose a fix like Laurent did
now was the fact that:
- gdbserver_fork() is called unconditionally before gdbserver_start()
has ever been called
- gdbserver_fork() as result accesses gdbserver data structures before
they are inited, so we have NULL pointer access
Another issue is that gdbserver_fork() is only defined when
CONFIG_USER_ONLY is not defined but gdbserver_fork() is called when
always when USE_NPTL is defined.
So switching on CONFIG_USER_ONLY and USE_NPTL will result in
gdbserver_fork() beeing undefined. That was why my impression was that
the code is somewhat incomplete.
Also, does debugging work in user mode at all if USE_NPTL is on? If not
I would remove the call to gdbserver_fork() in this case completely.
Martin