From patchwork Wed May 6 17:10:30 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 6596 Received: (qmail 118132 invoked by alias); 6 May 2015 17:10:39 -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 118119 invoked by uid 89); 6 May 2015 17:10:39 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 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; Wed, 06 May 2015 17:10:38 +0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t46HAXtu022537 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 6 May 2015 13:10:33 -0400 Received: from blade.nx (ovpn-116-21.ams2.redhat.com [10.36.116.21]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t46HAWU1011991; Wed, 6 May 2015 13:10:32 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id E038D263C9C; Wed, 6 May 2015 18:10:30 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Cc: Philippe Waroquiers Subject: [PATCH] Locate executables on remote stubs without multiprocess extensions Date: Wed, 6 May 2015 18:10:30 +0100 Message-Id: <1430932230-12551-1-git-send-email-gbenson@redhat.com> In-Reply-To: <20150506103145.GA30896@blade.nx> References: <20150506103145.GA30896@blade.nx> X-IsSubscribed: yes Hi all, This commit allows GDB to determine filenames of main executables when debugging using remote stubs without multiprocess extensions. The qXfer:exec-file:read packet is extended to allow an empty annex, with the meaning that the remote stub should supply the filename of whatever it thinks is the current process. Built and regtested on RHEL6.6 x86_64. Is this ok to commit? Cheers, Gary gdb/ChangeLog: * remote.c (remote_add_inferior): Call exec_file_locate_attach for fake PIDs as well as real ones. (remote_pid_to_exec_file): Send empty annex if PID is fake. gdb/doc/ChangeLog: * gdb.texinfo (General Query Packets): Document qXfer:exec-file:read with empty annex. gdb/gdbserver/ChangeLog: * server.c (handle_qxfer_exec_file): Use current process if annex is empty. --- gdb/ChangeLog | 6 ++++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/gdb.texinfo | 3 ++- gdb/gdbserver/ChangeLog | 5 +++++ gdb/gdbserver/server.c | 25 ++++++++++++++++++++----- gdb/remote.c | 15 ++++++++++++--- 6 files changed, 50 insertions(+), 9 deletions(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 9e2787d..63e063a 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -36558,7 +36558,8 @@ by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}). Return the full absolute name of the file that was executed to create a process running on the remote system. The annex specifies the numeric process ID of the process to query, encoded as a hexadecimal -number. +number. If the annex part is empty the remote stub should return the +filename corresponding to the currently executing process. This packet is not probed by default; the remote stub must request it, by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}). diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index d2e20d9..516a311 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1144,17 +1144,32 @@ handle_qxfer_exec_file (const char *const_annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, LONGEST len) { - char *annex, *file; + char *file; ULONGEST pid; int total_len; if (the_target->pid_to_exec_file == NULL || writebuf != NULL) return -2; - annex = alloca (strlen (const_annex) + 1); - strcpy (annex, const_annex); - annex = unpack_varlen_hex (annex, &pid); - if (annex[0] != '\0' || pid == 0) + if (const_annex[0] == '\0') + { + if (current_thread == NULL) + return -1; + + pid = pid_of (current_thread); + } + else + { + char *annex = alloca (strlen (const_annex) + 1); + + strcpy (annex, const_annex); + annex = unpack_varlen_hex (annex, &pid); + + if (annex[0] != '\0') + return -1; + } + + if (pid < 0) return -1; file = (*the_target->pid_to_exec_file) (pid); diff --git a/gdb/remote.c b/gdb/remote.c index 099ddbb..6b18960 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -1558,7 +1558,7 @@ remote_add_inferior (int fake_pid_p, int pid, int attached, /* If no main executable is currently open then attempt to open the file that was executed to create this inferior. */ - if (try_open_exec && !fake_pid_p && get_exec_file (0) == NULL) + if (try_open_exec && get_exec_file (0) == NULL) exec_file_locate_attach (pid, 1); return inf; @@ -11710,7 +11710,8 @@ static char * remote_pid_to_exec_file (struct target_ops *self, int pid) { static char *filename = NULL; - char annex[9]; + struct inferior *inf; + char *annex = NULL; if (packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE) return NULL; @@ -11718,7 +11719,15 @@ remote_pid_to_exec_file (struct target_ops *self, int pid) if (filename != NULL) xfree (filename); - xsnprintf (annex, sizeof (annex), "%x", pid); + inf = find_inferior_pid (pid); + if (inf != NULL && !inf->fake_pid_p) + { + const int annex_size = 9; + + annex = alloca (annex_size); + xsnprintf (annex, annex_size, "%x", pid); + } + filename = target_read_stralloc (¤t_target, TARGET_OBJECT_EXEC_FILE, annex);