From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LKHIO-0002T0-IX for qemu-devel@nongnu.org; Tue, 06 Jan 2009 14:08:56 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LKHIN-0002Sf-0B for qemu-devel@nongnu.org; Tue, 06 Jan 2009 14:08:55 -0500 Received: from [199.232.76.173] (port=39228 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LKHIM-0002Sc-Qf for qemu-devel@nongnu.org; Tue, 06 Jan 2009 14:08:54 -0500 Received: from moutng.kundenserver.de ([212.227.17.9]:56933) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LKHIM-00071z-7R for qemu-devel@nongnu.org; Tue, 06 Jan 2009 14:08:54 -0500 Message-ID: <4963AC44.3020205@opensuse.org> Date: Tue, 06 Jan 2009 20:08:52 +0100 From: Martin Mohring MIME-Version: 1.0 Subject: Re: [Qemu-devel] [6095] User-mode GDB stub improvements - handle fork References: <49638483.4050701@opensuse.org> In-Reply-To: <49638483.4050701@opensuse.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org 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 >> Signed-off-by: Aurelien Jarno >> >> 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