From patchwork Sat Jun 2 00:59:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Joel Brobecker X-Patchwork-Id: 27604 Received: (qmail 27894 invoked by alias); 2 Jun 2018 00:59:50 -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 27861 invoked by uid 89); 2 Jun 2018 00:59:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=debugged, consume, proposing, cookbook X-HELO: rock.gnat.com Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 02 Jun 2018 00:59:44 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 3DCEE56103; Fri, 1 Jun 2018 20:59:43 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id wf+gD7bX2X3F; Fri, 1 Jun 2018 20:59:43 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 0C37856102; Fri, 1 Jun 2018 20:59:43 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id 33C62808EA; Fri, 1 Jun 2018 17:59:41 -0700 (PDT) Date: Fri, 1 Jun 2018 17:59:41 -0700 From: Joel Brobecker To: Pedro Alves Cc: Simon Marchi , gdb-patches@sourceware.org Subject: Re: [RFC] (windows) GDB/MI crash when using "-list-thread-groups --available" Message-ID: <20180602005941.f4l5nudlsl3xez4v@adacore.com> References: <1525978704-70543-1-git-send-email-brobecker@adacore.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) > > Looking at how it works on Linux, it's the process stratum, > > inf_ptrace_target, that answers this request.  On Windows, shouldn't > > windows_nat_target answer this request?  After all, it's the > > responsibility of windows_nat_target to communicate with the Windows > > OS to debug processes natively on it. > > Yeah, it's just that the Windows port doesn't really implement the > feature at all, AFAICT. Ideally it'd be implemented. Otherwise, > I guess handling the case of not having a target beneath > here is reasonable. > > > >> Also, The testcase I am proposing fails on the -list-thread-groups test > >> when run on GNU/Linux because, on that platform, the command returns > >> more output than the expect buffer can handle, resulting in an UNRESOLVED > >> status. How does one usually handle this? The only why I can think of > >> is a loop of gdb_test_multiple... Other ideas? [...] > Yeah, the best way to address this is to consume > output in chunks, with exp_continue. That fixes it for good. > See for example: > > commit 11859c310cd6b6fd892337a5ee1d36921e6d08d8 Thanks for the pointer. I've taken the liberty of updating our testcase cookbook to reference it as well, so we know where to look next time we hit that issue. Attached is an updated version which follows the same principle. gdb/ChangeLog: * windows-nat.c (windows_nat_target::xfer_partial): Return TARGET_XFER_E_IO if we need to delegate to the target beneath but BENEATH is NULL. gdb/testsuite/ChangeLog: * gdb.mi/mi-list-thread-groups-no-inferior.exp: New testcase. Test verified on x86_64-linux to confirm that the large amount of output is properly handled. OK to push? From 6cf99a70c551b2a672d7732442f2da13154cab0c Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Fri, 1 Jun 2018 19:54:38 -0500 Subject: [PATCH] (windows) GDB/MI crash when using "-list-thread-groups --available" On Windows, using the "-list-thread-groups --available" GDB/MI command before an inferior is being debugged: % gdb -q -i=mi =thread-group-added,id="i1" =cmd-param-changed,param="auto-load safe-path",value="/" (gdb) -list-thread-groups --available Segmentation fault Ooops! The SEGV happens because the -list-thread-groups --available command triggers a windows_nat_target::xfer_partial call for a TARGET_OBJECT_OSDATA object. Until a program is being debugged, the target_ops layer that gets the call is the Windows "native" layer. Except for a couple of specific objects (TARGET_OBJECT_MEMORY and TARGET_OBJECT_LIBRARIES), this layer's xfer_partial method delegates the xfer of other objects to the target beneath: default: return beneath->xfer_partial (object, annex, readbuf, writebuf, offset, len, xfered_len); Unfortunately, there is no "beneath layer" in this case, so beneath is NULL and dereferencing it leads to the SEGV. This patch fixes the issue by checking beneath before trying to delegate the request. gdb/ChangeLog: * windows-nat.c (windows_nat_target::xfer_partial): Return TARGET_XFER_E_IO if we need to delegate to the target beneath but BENEATH is NULL. gdb/testsuite/ChangeLog: * gdb.mi/mi-list-thread-groups-no-inferior.exp: New testcase. --- .../gdb.mi/mi-list-thread-groups-no-inferior.exp | 43 ++++++++++++++++++++++ gdb/windows-nat.c | 7 ++++ 2 files changed, 50 insertions(+) create mode 100644 gdb/testsuite/gdb.mi/mi-list-thread-groups-no-inferior.exp diff --git a/gdb/testsuite/gdb.mi/mi-list-thread-groups-no-inferior.exp b/gdb/testsuite/gdb.mi/mi-list-thread-groups-no-inferior.exp new file mode 100644 index 0000000..381f6f1 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-list-thread-groups-no-inferior.exp @@ -0,0 +1,43 @@ +# 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 . + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +gdb_exit +if [mi_gdb_start] { + continue +} + +# Try the "-list-thread-groups --available". This command can generate +# a very large amount of output, potentially exceeding expect's buffer +# size. So we consume the output in chunks. + +set test "-list-thread-groups --available" +gdb_test_multiple $test $test { + -re ".*\}" { + exp_continue + } + -re "\r\n$gdb_prompt " { + pass $test + } +} + +# Verify that GDB is still alive. + +mi_gdb_test "-data-evaluate-expression 1" \ + ".*\\^done,value=\"1\"" \ + "check GDB is still alive" + diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 0f24257..e3e36cd 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -2966,6 +2966,13 @@ windows_nat_target::xfer_partial (enum target_object object, writebuf, offset, len, xfered_len); default: + if (beneath == NULL) + { + /* This can happen when requesting the transfer of unsupported + objects before a program has been started (and therefore + with the current_target having no target beneath). */ + return TARGET_XFER_E_IO; + } return beneath->xfer_partial (object, annex, readbuf, writebuf, offset, len, xfered_len); -- 2.1.4