From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26569 invoked by alias); 2 Sep 2015 04:18:15 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 26553 invoked by uid 89); 2 Sep 2015 04:18:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 required=5.0 tests=AWL,BAYES_00,KAM_LAZY_DOMAIN_SECURITY,SPF_HELO_PASS,T_RP_MATCHES_RCVD autolearn=no 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, 02 Sep 2015 04:18:12 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id C30CC2B7856 for ; Wed, 2 Sep 2015 04:18:11 +0000 (UTC) Received: from localhost (unused-10-15-17-51.yyz.redhat.com [10.15.17.51]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t824IAco010544 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Wed, 2 Sep 2015 00:18:11 -0400 From: Sergio Durigan Junior To: Gary Benson Cc: GDB Patches Subject: Re: [PATCH 2/2] Catching errors on probes-based dynamic linker interface References: <1440200253-28603-1-git-send-email-sergiodj@redhat.com> <1440200253-28603-3-git-send-email-sergiodj@redhat.com> <20150824084255.GA16508@blade.nx> <87r3msd5xr.fsf@redhat.com> <20150825124748.GA6948@blade.nx> <87wpwjgrmt.fsf@redhat.com> <87lhcq7raj.fsf@redhat.com> <20150901092449.GA6172@blade.nx> <87h9ne6r8j.fsf@redhat.com> X-URL: http://blog.sergiodj.net Date: Wed, 02 Sep 2015 04:18:00 -0000 In-Reply-To: <87h9ne6r8j.fsf@redhat.com> (Sergio Durigan Junior's message of "Tue, 01 Sep 2015 12:26:04 -0400") Message-ID: <8737yx78u5.fsf@redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes X-SW-Source: 2015-09/txt/msg00023.txt.bz2 On Tuesday, September 01 2015, I wrote: >> I am ok with doing this: >> >> TRY >> { >> probe_argc = get_probe_argument_count (pa->probe, frame); >> } >> CATCH (ex, RETURN_MASK_ERROR) >> { >> exception_print (gdb_stderr, ex); >> probe_argc = 0; >> } >> END_CATCH >> >> If you put a big fat comment above the following block, e.g.: >> >> /* Note that failure of get_probe_argument_count will >> set probe_argc == 0. This must result in returning >> action = PROBES_INTERFACE_FAILED. */ >> if (probe_argc == 2) >> action = FULL_RELOAD; >> else if (probe_argc < 2) >> action = PROBES_INTERFACE_FAILED; > > Great, that works for me as well. I will update the patch here to > address this. I took the liberty to modify and expand the comment; I hope you still find it OK. Here's what I pushed. Thanks, -- Sergio GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36 Please send encrypted e-mail if possible http://sergiodj.net/ >From eb7f0ec56321645e1999ddbac9db4e4cd14d03e4 Mon Sep 17 00:00:00 2001 From: Sergio Durigan Junior Date: Fri, 21 Aug 2015 18:28:07 -0400 Subject: [PATCH 2/2] Catching errors on probes-based dynamic linker interface This patch is intended to make the interaction between the probes-based dynamic linker interface and the SystemTap SDT probe code on GDB more robust. It does that by wrapping the calls to the probe API with TRY...CATCH'es, so that any exception thrown will be caught and handled properly. The idea for this patch came from , which is a bug initially filed against Fedora GDB (but now under Fedora GLIBC). This bug happens on armhfp (although it could happen on other targets as well), and is triggered because GCC generates a strange argument for one of the probes used by GDB in the dynamic linker interface. As can be seen in the bug, this argument is "-4@.L1052". I don't want to discuss the reasons for this argument to be there (this discussion belongs to the bug, or to another thread), but GDB could definitely do a better error handling here. Currently, one sees the following message when there is an error in the probes-based dynamic linker interface: (gdb) run Starting program: /bin/inferior warning: Probes-based dynamic linker interface failed. Reverting to original interface. Cannot parse expression `.L976 4@r4'. (gdb) Which means that one needs to explicitly issue a "continue" command to make GDB continue running the inferior, even though this error is not fatal and GDB will fallback to the old interface automatically. This is where this patch helps: it makes GDB still print the necessary warnings or error messages, but it *also* does not stop the inferior unnecessarily. I have tested this patch on the systems where this error happens, but I could not come up with a way to create a testcase for it. Nevertheless, it should be straightforward to see that this patch does improve the current situation. OK to apply? gdb/ChangeLog: 2015-08-21 Sergio Durigan Junior * solib-svr4.c (solib_event_probe_action): Call get_probe_argument_count using TRY...CATCH. (svr4_handle_solib_event): Likewise, for evaluate_probe_argument. --- gdb/solib-svr4.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 36b6c59..5d2b9dd 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1786,7 +1786,23 @@ solib_event_probe_action (struct probe_and_action *pa) arg0: Lmid_t lmid (mandatory) arg1: struct r_debug *debug_base (mandatory) arg2: struct link_map *new (optional, for incremental updates) */ - probe_argc = get_probe_argument_count (pa->probe, frame); + TRY + { + probe_argc = get_probe_argument_count (pa->probe, frame); + } + CATCH (ex, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, ex); + probe_argc = 0; + } + END_CATCH + + /* If get_probe_argument_count throws an exception, probe_argc will + be set to zero. However, if pa->probe does not have arguments, + then get_probe_argument_count will succeed but probe_argc will + also be zero. Both cases happen because of different things, but + they are treated equally here: action will be set to + PROBES_INTERFACE_FAILED. */ if (probe_argc == 2) action = FULL_RELOAD; else if (probe_argc < 2) @@ -1940,7 +1956,17 @@ svr4_handle_solib_event (void) usm_chain = make_cleanup (resume_section_map_updates_cleanup, current_program_space); - val = evaluate_probe_argument (pa->probe, 1, frame); + TRY + { + val = evaluate_probe_argument (pa->probe, 1, frame); + } + CATCH (ex, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, ex); + val = NULL; + } + END_CATCH + if (val == NULL) { do_cleanups (old_chain); @@ -1971,7 +1997,18 @@ svr4_handle_solib_event (void) if (action == UPDATE_OR_RELOAD) { - val = evaluate_probe_argument (pa->probe, 2, frame); + TRY + { + val = evaluate_probe_argument (pa->probe, 2, frame); + } + CATCH (ex, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, ex); + do_cleanups (old_chain); + return; + } + END_CATCH + if (val != NULL) lm = value_as_address (val); -- 2.4.3