From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13931 invoked by alias); 29 Jun 2009 17:51:42 -0000 Received: (qmail 13920 invoked by uid 22791); 29 Jun 2009 17:51:41 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 29 Jun 2009 17:51:36 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n5THnYWd026735; Mon, 29 Jun 2009 13:49:34 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n5THnXtI024315; Mon, 29 Jun 2009 13:49:33 -0400 Received: from host0.dyn.jankratochvil.net (sebastian-int.corp.redhat.com [172.16.52.221]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n5THnVCF018733; Mon, 29 Jun 2009 13:49:32 -0400 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.3/8.14.3) with ESMTP id n5THnVU7010330; Mon, 29 Jun 2009 19:49:31 +0200 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.3/8.14.3/Submit) id n5THnTwh010326; Mon, 29 Jun 2009 19:49:29 +0200 Date: Mon, 29 Jun 2009 17:51:00 -0000 From: Jan Kratochvil To: Pedro Alves Cc: gdb-patches@sourceware.org Subject: Re: [patch] Fix internal-error on dead LWPs with no associated thread Message-ID: <20090629174929.GA9652@host0.dyn.jankratochvil.net> References: <20090629100922.GA26882@host0.dyn.jankratochvil.net> <200906291136.28812.pedro@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <200906291136.28812.pedro@codesourcery.com> User-Agent: Mutt/1.5.19 (2009-01-05) 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: 2009-06/txt/msg00834.txt.bz2 On Mon, 29 Jun 2009 12:36:28 +0200, Pedro Alves wrote: > On Monday 29 June 2009 11:09:22, Jan Kratochvil wrote: > > > original bugreport: > > https://bugzilla.redhat.com/show_bug.cgi?id=471819 > > > > linux-nat.c:1662: internal-error: linux_nat_resume: Assertion `lp != NULL' failed. [...] > Please try the below patchlet instead. Do you have any other case where this > would be needed? [...] > + if (!ptid_equal (ecs->ptid, inferior_ptid)) > + context_switch (ecs->ptid); > target_resume (RESUME_ALL, 0, TARGET_SIGNAL_0); > prepare_to_wait (ecs); > return; Your patch works for my testcase and I failed to find any countercase for it. It has no regressions on {x86_64,i686}-fedora-linux-gnu. Could you please check it in? Also the attached testcase needs an approval. > Does anyone know why does the new_thread_event bit need to resume the target > at all? Removing that resume should fix the issue too. I find it more as a cleanup and going to send a followup with a patch made now for it. Thanks, Jan gdb/testsuite/ 2009-06-29 Jan Kratochvil * gdb.threads/current-lwp-dead.exp, gdb.threads/current-lwp-dead.c: New. --- /dev/null +++ b/gdb/testsuite/gdb.threads/current-lwp-dead.c @@ -0,0 +1,75 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2009 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + + Do not use threads as we need to exploit a bug in LWP code masked by the + threads code otherwise. + + INFERIOR_PTID must point to exited LWP. Here we use the initial LWP as it + is automatically INFERIOR_PTID for GDB. + + Finally we need to call target_resume (RESUME_ALL, ...) which we invoke by + NEW_THREAD_EVENT (called from the new LWP as initial LWP is exited now). */ + +#define _GNU_SOURCE +#include +#include +#include +#include + +#define STACK_SIZE 0x1000 + +static int +fn_return (void *unused) +{ + return 0; /* at-fn_return */ +} + +static int +fn (void *unused) +{ + int i; + unsigned char *stack; + int new_pid; + + i = sleep (1); + assert (i == 0); + + stack = malloc (STACK_SIZE); + assert (stack != NULL); + + new_pid = clone (fn_return, stack + STACK_SIZE, CLONE_FILES | CLONE_VM, NULL, + NULL, NULL, NULL); + assert (new_pid > 0); + + return 0; +} + +int +main (int argc, char **argv) +{ + unsigned char *stack; + int new_pid; + + stack = malloc (STACK_SIZE); + assert (stack != NULL); + + new_pid = clone (fn, stack + STACK_SIZE, CLONE_FILES | CLONE_VM, NULL, NULL, + NULL, NULL); + assert (new_pid > 0); + + return 0; +} --- /dev/null +++ b/gdb/testsuite/gdb.threads/current-lwp-dead.exp @@ -0,0 +1,31 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2009 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@gnu.org + +if { [prepare_for_testing current-lwp-dead.exp current-lwp-dead] } { + return -1 +} + +if {[runto_main] <= 0} { + untested current-lwp-dead.exp + return -1 +} + +gdb_breakpoint "fn_return" +gdb_continue_to_breakpoint "fn_return" ".*at-fn_return.*"