From patchwork Tue Apr 7 18:29:46 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 6076 Received: (qmail 48826 invoked by alias); 7 Apr 2015 18:29:51 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 48816 invoked by uid 89); 7 Apr 2015 18:29:50 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=AWL, BAYES_00, SPF_HELO_PASS, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Tue, 07 Apr 2015 18:29:49 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t37ITmE1006531 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Tue, 7 Apr 2015 14:29:48 -0400 Received: from brno.lan (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t37ITlYJ029828 for ; Tue, 7 Apr 2015 14:29:47 -0400 From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH] PR server/18081: gdbserver crashes when providing an unexisting binary Date: Tue, 7 Apr 2015 19:29:46 +0100 Message-Id: <1428431386-16530-1-git-send-email-palves@redhat.com> $ ./gdbserver :1234 blah Process blah created; pid = 16471 Cannot exec blah: No such file or directory. Child exited with status 127 Killing process(es): 16471 ../../../../src/binutils-gdb/gdb/gdbserver/linux-low.c:920: A problem internal to GDBserver has been detected. kill_wait_lwp: Assertion `res > 0' failed. GDBserver shouldn't even be trying to kill that process. GDBserver kills or detaches from all processes on exit, and due to a missing mourn_inferior call, GDBserver tries to kill the process that it had already seen exit. Tested on x86_64 Fedora 20. New test included. I emulated what Windows outputs by hacking an error call in linux_create_inferior. gdb/gdbserver/ChangeLog: 2015-04-07 Pedro Alves PR server/18081 * server.c (start_inferior): If the process exits, mourn it. gdb/testsuite/ChangeLog: 2015-04-07 Pedro Alves PR server/18081 * gdb.server/non-existing-program.exp: New file. --- gdb/gdbserver/server.c | 2 + gdb/testsuite/gdb.server/non-existing-program.exp | 63 +++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 gdb/testsuite/gdb.server/non-existing-program.exp diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 3408ef7..d57674d 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -284,6 +284,8 @@ start_inferior (char **argv) current_thread->last_resume_kind = resume_stop; current_thread->last_status = last_status; } + else + mourn_inferior (find_process_pid (ptid_get_pid (last_ptid))); return signal_pid; } diff --git a/gdb/testsuite/gdb.server/non-existing-program.exp b/gdb/testsuite/gdb.server/non-existing-program.exp new file mode 100644 index 0000000..f842c44 --- /dev/null +++ b/gdb/testsuite/gdb.server/non-existing-program.exp @@ -0,0 +1,63 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2015 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 . + +# Test starting gdbserver passing it the name of a non-existing +# program. + +load_lib gdbserver-support.exp + +standard_testfile + +if { [skip_gdbserver_tests] } { + return 0 +} + +set gdbserver [find_gdbserver] +if { $gdbserver == "" } { + fail "could not find gdbserver" + return +} + +# Fire off gdbserver. The port doesn't really matter, gdbserver tries +# to spawn the program before opening the connection. +set spawn_id [remote_spawn target "$gdbserver stdio non-existing-program"] + +set msg "gdbserver exits cleanly" +set saw_exiting 0 +expect { + # This is what we get on ptrace-based targets. + -re "stdin/stdout redirected.*No program to debug\r\nExiting\r\n$" { + set saw_exiting 1 + exp_continue + } + # This is what we get on Windows. + -re "Error creating process\r\n\r\nExiting\r\n$" { + set saw_exiting 1 + exp_continue + } + -re "A problem internal to GDBserver has been detected" { + fail "$msg (GDBserver internal error)" + wait + } + eof { + gdb_assert $saw_exiting $msg + wait + } + timeout { + fail "$msg (timeout)" + } +}