From patchwork Sun Apr 9 06:07:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin Buettner X-Patchwork-Id: 19924 Received: (qmail 90829 invoked by alias); 9 Apr 2017 06:07: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 90737 invoked by uid 89); 9 Apr 2017 06:07:30 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No 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, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=8643, circumstance 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 ESMTP; Sun, 09 Apr 2017 06:07:29 +0000 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7A3338553E for ; Sun, 9 Apr 2017 06:07:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 7A3338553E Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=kevinb@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 7A3338553E Received: from pinnacle.lan (ovpn-116-88.phx2.redhat.com [10.3.116.88]) by smtp.corp.redhat.com (Postfix) with ESMTP id 57A4F892EA for ; Sun, 9 Apr 2017 06:07:29 +0000 (UTC) Date: Sat, 8 Apr 2017 23:07:27 -0700 From: Kevin Buettner To: gdb-patches@sourceware.org Subject: [PATCH v2 5/7] Add thread_db_notice_clone to gdbserver Message-ID: <20170408230727.0f65ad8f@pinnacle.lan> In-Reply-To: <20170408224959.67164a27@pinnacle.lan> References: <20170408224959.67164a27@pinnacle.lan> MIME-Version: 1.0 X-IsSubscribed: yes While working on a patch for fetching a thread handle in gdbserver, I ran into a circumstance in which tests in gdb.mi/mi-nsmoribund.exp would occasionally fail. Over a large enough number of runs, it would fail roughly 2% of the time. That thread handle patch caused find_one_thread() to be called on every stop. find_one_thread() calls td_ta_map_lwp2thr() which, in turn, can cause ps_get_thread_area() to be called. ps_get_thread_area() makes a call to ptrace() for getting the thread area address. If this should happen when the thread is not stopped, the call to ptrace will return error which in turn propogates back to find_one_thread(). find_one_thread() calls error() in this instance which causes the program to die. This patch causes find_one_thread() to be called upon reciept of a clone event. Since the clone is stopped, the circumstances described above cannot occur. gdb/gdbserver/ChangeLog: * linux-low.c (handle_extended_wait): Call thread_db_notice_clone(). * linux-low.h (thread_db_notice_clone): Declare. * thread-db.c (thread_db_notice_clone): New function. --- gdb/gdbserver/linux-low.c | 2 ++ gdb/gdbserver/linux-low.h | 1 + gdb/gdbserver/thread-db.c | 14 ++++++++++++++ 3 files changed, 17 insertions(+) diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index e27cbf8..6f06eb8 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -653,6 +653,8 @@ handle_extended_wait (struct lwp_info **orig_event_lwp, int wstat) new_lwp->status_pending = status; } + thread_db_notice_clone (get_thread_process (event_thr), ptid); + /* Don't report the event. */ return 1; } diff --git a/gdb/gdbserver/linux-low.h b/gdb/gdbserver/linux-low.h index 7dcbfcf..87ce53a 100644 --- a/gdb/gdbserver/linux-low.h +++ b/gdb/gdbserver/linux-low.h @@ -409,5 +409,6 @@ int thread_db_handle_monitor_command (char *); int thread_db_get_tls_address (struct thread_info *thread, CORE_ADDR offset, CORE_ADDR load_module, CORE_ADDR *address); int thread_db_look_up_one_symbol (const char *name, CORE_ADDR *addrp); +void thread_db_notice_clone (struct process_info *proc, ptid_t lwp); extern int have_ptrace_getregset; diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c index 1ffb79d..eff1914 100644 --- a/gdb/gdbserver/thread-db.c +++ b/gdb/gdbserver/thread-db.c @@ -864,3 +864,17 @@ thread_db_handle_monitor_command (char *mon) /* Tell server.c to perform default processing. */ return 0; } + +void +thread_db_notice_clone (struct process_info *proc, ptid_t ptid) +{ + struct thread_db *thread_db = proc->priv->thread_db; + + /* If the thread layer isn't initialized, return. It may just + be that the program uses clone, but does not use libthread_db. */ + if (thread_db == NULL || !thread_db->all_symbols_looked_up) + return; + + if (!find_one_thread (ptid)) + warning ("Cannot find thread after clone.\n"); +}