From patchwork Thu Jul 30 23:19:19 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Don Breazeal X-Patchwork-Id: 7948 Received: (qmail 17292 invoked by alias); 30 Jul 2015 23:20:11 -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 17280 invoked by uid 89); 30 Jul 2015 23:20:10 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: relay1.mentorg.com Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 30 Jul 2015 23:20:09 +0000 Received: from svr-orw-fem-04.mgc.mentorg.com ([147.34.97.41]) by relay1.mentorg.com with esmtp id 1ZKx7O-00052S-8D from Don_Breazeal@mentor.com ; Thu, 30 Jul 2015 16:20:06 -0700 Received: from build4-lucid-cs (147.34.91.1) by svr-orw-fem-04.mgc.mentorg.com (147.34.97.41) with Microsoft SMTP Server id 14.3.224.2; Thu, 30 Jul 2015 16:20:05 -0700 Received: by build4-lucid-cs (Postfix, from userid 1905) id 7979941034; Thu, 30 Jul 2015 16:20:06 -0700 (PDT) From: Don Breazeal To: , Subject: [PATCH v2 4/5] Eliminate spurious warnings from remote exec Date: Thu, 30 Jul 2015 16:19:19 -0700 Message-ID: <1438298360-29594-5-git-send-email-donb@codesourcery.com> In-Reply-To: <1438298360-29594-1-git-send-email-donb@codesourcery.com> References: <1436996979-32350-1-git-send-email-donb@codesourcery.com> <1438298360-29594-1-git-send-email-donb@codesourcery.com> MIME-Version: 1.0 X-IsSubscribed: yes This patch is unchanged from the previous version. ----- This patch eliminates some spurious gdbserver warnings that occur when following an exec event on extended-remote Linux targets. When gdbserver on Linux sets up the hook for shared library load detection, an initial step is to read the version number field of the r_debug structure from memory. In the current implementation, if the version number is not equal to one, a warning is printed by gdbserver. However, the number can be zero if the structure has not been initialized yet. This seems to happen most of the time after an exec. To suppress the warnings the error check was changed so that if the version number is not equal to one the function silently returns -1. Subsequent calls to the routine find an initialized r_debug structure. Tested on x86_64 GNU/Linux, both GDB tests and manual testing which followed an exec, then debugged a shared library loaded by the exec'd program to ensure that there were no warnings and that debugging shared libs was not adversely affected. Thanks --Don gdb/gdbserver/ 2015-07-30 Don Breazeal * linux-low.c (linux_qxfer_libraries_svr4): Return silently on r_debug version error instead of printing a warning. --- gdb/gdbserver/linux-low.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index af4619f..c0770b8 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -580,6 +580,7 @@ handle_extended_wait (struct lwp_info *event_lwp, int wstat) else if (event == PTRACE_EVENT_EXEC && report_exec_events) { struct regcache *regcache; + struct process_info *proc; if (debug_threads) { @@ -598,10 +599,15 @@ handle_extended_wait (struct lwp_info *event_lwp, int wstat) /* The new executable may be for a different architecture than that of the execing process, so re-initialize the architecture. - The call to get_pc will refill the register cache. */ + The call to get_pc will refill the register cache. Force re- + initialization of r_debug from the (possibly) different dynamic + loader. */ linux_arch_setup_thread (event_thr); event_lwp->stop_pc = get_pc (event_lwp); + proc = get_thread_process (event_thr); + proc->priv->r_debug = 0; + /* Save the event for reporting. */ event_lwp->waitstatus.kind = TARGET_WAITKIND_EXECD; event_lwp->waitstatus.value.execd_pathname = xstrdup (linux_proc_pid_to_exec_file (lwpid_of (event_thr))); @@ -6462,10 +6468,16 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf, { if (linux_read_memory (priv->r_debug + lmo->r_version_offset, (unsigned char *) &r_version, - sizeof (r_version)) != 0 - || r_version != 1) + sizeof (r_version)) != 0) + warning ("error reading r_debug version from memory"); + else if (r_version != 1) { - warning ("unexpected r_debug version %d", r_version); + /* We expect version 1 for glibc. If the version is incorrect, + it probably means that r_debug hasn't been initialized yet. + Just silently return an error. We will try again in a + subsequent pass through here, e.g. at the next library load + event. */ + return -1; } else if (read_one_ptr (priv->r_debug + lmo->r_map_offset, &lm_addr, ptr_size) != 0)