From patchwork Wed Jul 25 23:05:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 28620 Received: (qmail 76133 invoked by alias); 25 Jul 2018 23:05:32 -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 76113 invoked by uid 89); 25 Jul 2018 23:05:31 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_PASS autolearn=ham version=3.3.2 spammy=respects, investigated X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 25 Jul 2018 23:05:28 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 3F9D1ADF5; Wed, 25 Jul 2018 23:05:26 +0000 (UTC) Subject: Re: [PATCH][gdb/breakpoints] Fix sigsegv in info prog at exec catchpoint To: Tom Tromey Cc: gdb-patches@sourceware.org References: <20180720141359.qycrai5coi5rdyag@delia> <87wotjyvkh.fsf@tromey.com> From: Tom de Vries Message-ID: Date: Thu, 26 Jul 2018 01:05:42 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <87wotjyvkh.fsf@tromey.com> X-IsSubscribed: yes On 07/25/2018 09:17 PM, Tom Tromey wrote: >>>>>> "Tom" == Tom de Vries writes: > > Tom> The patch fixes the segfault by returning an error in info_program_command > Tom> if get_last_target_status returns minus_one_ptid. > > Tom> The test-case is non-standard, because the standard approach runs into > Tom> PR23020, a problem with gdb going to the background. > > Is it possible to fix this part first? I've investigated a bit, but I think I need serious time to be able to fix this, I'm not familiar with the tty interface. > Otherwise it seems to me that the test case has some issues. > > Also, is the bug dependent on -batch? No, that's the way to run the test-case without running into PR23368 (gdb going to the background). > This wasn't clear to me, but I > guess if it is then the approach to the test case makes more sense. > > Tom> PR breakpoints/23366 > Tom> * infcmd.c (info_program_command): Handle ptid == minus_one_ptid. > > This part looks ok to me. > > Tom> +if { ![file exists /bin/bash] } { > ... > Tom> +if { ![file exists /bin/ls] } { > ... > Tom> + catch {exec /bin/bash -c "$GDB $FLAGS"} catchlog > I'm now using "remote_file target exists". > I think this sort of thing can't be done when doing remote host testing, > so some sort of check is needed for that. I don't remember any more > exactly how this is done but there should be other examples in the tree. > > Tom> +if { ![file exists /bin/bash] } { > Tom> + unsupported "no bash" > Tom> +} > > Also there has to be a "return" after the "unsupported"; unsupported > just logs a message and without the return, the rest of the test will > still be run. > Updated accordingly and committed as attached. Thanks, - Tom [gdb/breakpoints] Fix sigsegv in info prog at exec catchpoint With the test-case contained in this patch and compiled for debug we run into a segfault with trunk gdb: ... $ gdb catch-follow-exec -batch -ex "catch exec" \ -ex "set follow-exec-mode new" -ex "run" -ex "info prog" Catchpoint 1 (exec) process xxx is executing new program: /usr/bin/ls [New inferior 2 (process 0)] [New process xxx] Thread 2.1 "ls" hit Catchpoint 1 (exec'd /usr/bin/ls), in _start () from /lib64/ld-linux-x86-64.so.2 Segmentation fault (core dumped) ... The patch fixes the segfault by returning an error in info_program_command if get_last_target_status returns minus_one_ptid. The test-case is non-standard, because the standard approach runs into PR23368, a problem with gdb going to the background. Build and reg-tested on x86_64-linux. 2018-07-20 Tom de Vries PR breakpoints/23366 * infcmd.c (info_program_command): Handle ptid == minus_one_ptid. * gdb.base/catch-follow-exec.c: New test. * gdb.base/catch-follow-exec.exp: New file. --- gdb/infcmd.c | 2 +- gdb/testsuite/gdb.base/catch-follow-exec.c | 10 +++++ gdb/testsuite/gdb.base/catch-follow-exec.exp | 58 ++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 821bcc6544..74d5956765 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -2091,7 +2091,7 @@ info_program_command (const char *args, int from_tty) get_last_target_status (&ptid, &ws); } - if (ptid == null_ptid) + if (ptid == null_ptid || ptid == minus_one_ptid) error (_("No selected thread.")); thread_info *tp = find_thread_ptid (ptid); diff --git a/gdb/testsuite/gdb.base/catch-follow-exec.c b/gdb/testsuite/gdb.base/catch-follow-exec.c new file mode 100644 index 0000000000..fa68a2a34e --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-follow-exec.c @@ -0,0 +1,10 @@ +#include +#include +#include + +int +main (void) +{ + char *exec_args[] = { "/bin/ls", "ppp", NULL }; + execve (exec_args[0], exec_args, NULL); +} diff --git a/gdb/testsuite/gdb.base/catch-follow-exec.exp b/gdb/testsuite/gdb.base/catch-follow-exec.exp new file mode 100644 index 0000000000..0e32ed4a6f --- /dev/null +++ b/gdb/testsuite/gdb.base/catch-follow-exec.exp @@ -0,0 +1,58 @@ +# Copyright 2018 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 . + +# Check whether finish respects the print pretty user setting when printing the +# function result. + +standard_testfile + +if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} { + return -1 +} + +if { ![remote_file target exists /bin/bash] } { + unsupported "no bash" + return +} + +if { ![remote_file target exists /bin/ls] } { + unsupported "no ls" + return +} + +proc catch_follow_exec { } { + global binfile + global GDB + + set test "catch-follow-exec" + + append FLAGS " \"$binfile\"" + append FLAGS " -batch" + append FLAGS " -ex \"catch exec\"" + append FLAGS " -ex \"set follow-exec-mode new\"" + append FLAGS " -ex \"run\"" + append FLAGS " -ex \"info prog\"" + + catch {exec /bin/bash -c "$GDB $FLAGS"} catchlog + send_log "$catchlog\n" + + if { [regexp {No selected thread} $catchlog] } { + pass $test + } else { + fail $test + } +} + +catch_follow_exec