From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24788 invoked by alias); 7 Dec 2008 20:17:00 -0000 Received: (qmail 24780 invoked by uid 22791); 7 Dec 2008 20:16:59 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 07 Dec 2008 20:16:04 +0000 Received: (qmail 12835 invoked from network); 7 Dec 2008 20:16:02 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 7 Dec 2008 20:16:02 -0000 From: Pedro Alves To: gdb-patches@sourceware.org Subject: mourn the correct dead inferior Date: Sun, 07 Dec 2008 20:17:00 -0000 User-Agent: KMail/1.9.10 Cc: Ulrich Weigand MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_J8CPJG3rmRMqZVy" Message-Id: <200812072016.09965.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-12/txt/msg00141.txt.bz2 --Boundary-00=_J8CPJG3rmRMqZVy Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1856 Here's a piece I mentioned a bit earlier today. In multi-process, we may be calling target_mourn_inferior on the wrong inferior, if the inferior that exited happens to *not* be the current inferior the user has selected. The obvious fix is to switch inferior_ptid to the ecs->ptid. But, there are a few targets that return invalid ptids on a TARGET_WAITKIND_EXIT or TARGET_WAITKIND_SIGNALLED. Even if they don't support multi-process, that means that later on, when target_mourn_inferior->generic_mourn_inferior is called, we would leave the dead inferior still listed (and if we have breakpoint locations per-inferior, as in the multiprocess branch, we will delete the breakpoint locations of the wrong inferior). The linux-thread-db.c has no good reason to be filtering the ptid the beneath target returns, so that's easy to fix, just return that the beneath layer returned. The other targets I'm adjusting, are doing this: if (pid == -1) { warning (_("Child process unexpectedly missing: %s"), safe_strerror (save_errno)); /* Claim it exited with unknown signal. */ ourstatus->kind = TARGET_WAITKIND_SIGNALLED; ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; return minus_one_ptid; } I'm not 100% sure what this catches, and, if this can really happen. A 'kill -9' perhaps? I've changed them to return inferior_ptid instead, which should still be OK, unless their target_mourn_inferior implementation could hang in that case --- I think not though. If we find that this is a problem, then we'll need a new TARGET_WAITKIND_DISAPPEARED and perhaps a corresponding new target_ops method to handle it (or just call generic_mourn_inferior) ... Comments? (I think that with further cleanups, we'll be switching inferior_ptid unconditionaly to the event ptid in all-stop as well...) -- Pedro Alves --Boundary-00=_J8CPJG3rmRMqZVy Content-Type: text/x-diff; charset="iso 8859-15"; name="mourn_dead_inferior.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="mourn_dead_inferior.diff" Content-length: 3823 2008-12-07 Pedro Alves (handle_inferior_event): On a TARGET_WAITKIND_EXITED or TARGET_WAITKIND_SIGNALLED, switch inferior_ptid to the event ptid. * linux_thread_db.c (thread_db_wait): On a TARGET_WAITKIND_EXITED or TARGET_WAITKIND_SIGNALLED, return the ptid the beneath target returned. * inf-ptrace.c (inf_ptrace_wait): Return inferior_ptid instead of minus_one_ptid if the inferior disappeared. * rs6000-nat.c (rs6000_wait): Likewise. * spu-linux-nat.c (spu_child_wait): Likewise. --- gdb/inf-ptrace.c | 2 +- gdb/infrun.c | 2 ++ gdb/linux-thread-db.c | 2 +- gdb/rs6000-nat.c | 2 +- gdb/spu-linux-nat.c | 2 +- 5 files changed, 6 insertions(+), 4 deletions(-) Index: src/gdb/infrun.c =================================================================== --- src.orig/gdb/infrun.c 2008-12-07 19:34:12.000000000 +0000 +++ src/gdb/infrun.c 2008-12-07 19:39:05.000000000 +0000 @@ -2271,6 +2271,7 @@ handle_inferior_event (struct execution_ case TARGET_WAITKIND_EXITED: if (debug_infrun) fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_EXITED\n"); + inferior_ptid = ecs->ptid; target_terminal_ours (); /* Must do this before mourn anyway */ print_stop_reason (EXITED, ecs->ws.value.integer); @@ -2289,6 +2290,7 @@ handle_inferior_event (struct execution_ case TARGET_WAITKIND_SIGNALLED: if (debug_infrun) fprintf_unfiltered (gdb_stdlog, "infrun: TARGET_WAITKIND_SIGNALLED\n"); + inferior_ptid = ecs->ptid; stop_print_frame = 0; target_terminal_ours (); /* Must do this before mourn anyway */ Index: src/gdb/linux-thread-db.c =================================================================== --- src.orig/gdb/linux-thread-db.c 2008-12-07 19:34:30.000000000 +0000 +++ src/gdb/linux-thread-db.c 2008-12-07 19:37:33.000000000 +0000 @@ -889,7 +889,7 @@ thread_db_wait (ptid_t ptid, struct targ if (ourstatus->kind == TARGET_WAITKIND_EXITED || ourstatus->kind == TARGET_WAITKIND_SIGNALLED) - return pid_to_ptid (-1); + return ptid; if (ourstatus->kind == TARGET_WAITKIND_EXECD) { Index: src/gdb/inf-ptrace.c =================================================================== --- src.orig/gdb/inf-ptrace.c 2008-12-07 19:34:33.000000000 +0000 +++ src/gdb/inf-ptrace.c 2008-12-07 19:36:26.000000000 +0000 @@ -410,7 +410,7 @@ inf_ptrace_wait (ptid_t ptid, struct tar /* Claim it exited with unknown signal. */ ourstatus->kind = TARGET_WAITKIND_SIGNALLED; ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; - return minus_one_ptid; + return inferior_ptid; } /* Ignore terminated detached child processes. */ Index: src/gdb/rs6000-nat.c =================================================================== --- src.orig/gdb/rs6000-nat.c 2008-12-07 19:34:36.000000000 +0000 +++ src/gdb/rs6000-nat.c 2008-12-07 19:36:43.000000000 +0000 @@ -546,7 +546,7 @@ rs6000_wait (ptid_t ptid, struct target_ /* Claim it exited with unknown signal. */ ourstatus->kind = TARGET_WAITKIND_SIGNALLED; ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; - return minus_one_ptid; + return inferior_ptid; } /* Ignore terminated detached child processes. */ Index: src/gdb/spu-linux-nat.c =================================================================== --- src.orig/gdb/spu-linux-nat.c 2008-12-07 19:34:59.000000000 +0000 +++ src/gdb/spu-linux-nat.c 2008-12-07 19:41:33.000000000 +0000 @@ -444,7 +444,7 @@ spu_child_wait (ptid_t ptid, struct targ /* Claim it exited with unknown signal. */ ourstatus->kind = TARGET_WAITKIND_SIGNALLED; ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN; - return minus_one_ptid; + return inferior_ptid; } store_waitstatus (ourstatus, status); --Boundary-00=_J8CPJG3rmRMqZVy--