From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 108204 invoked by alias); 26 Aug 2019 17:27:04 -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 108183 invoked by uid 89); 26 Aug 2019 17:27:04 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_PASS autolearn=ham version=3.3.1 spammy= X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 26 Aug 2019 17:27:02 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 1C75DAE00; Mon, 26 Aug 2019 17:27:00 +0000 (UTC) Subject: Re: [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes To: Sergio Durigan Junior Cc: gdb-patches@sourceware.org References: <20190725210447.GA26123@delia> <87h86410g2.fsf@redhat.com> From: Tom de Vries Openpgp: preference=signencrypt Message-ID: <21b5b8c0-01b5-2b47-a855-fdeb512909de@suse.de> Date: Mon, 26 Aug 2019 17:27:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <87h86410g2.fsf@redhat.com> Content-Type: multipart/mixed; boundary="------------ECEEFD63C94A63A70B4DCDE2" X-IsSubscribed: yes X-SW-Source: 2019-08/txt/msg00598.txt.bz2 This is a multi-part message in MIME format. --------------ECEEFD63C94A63A70B4DCDE2 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 4885 On 26-08-19 16:11, Sergio Durigan Junior wrote: > On Thursday, July 25 2019, Tom de Vries wrote: > >> Hi, >> >> When using catch catch/rethrow/catch, a libstdcxx with SDT probes is required >> for both the regexp argument, and the convenience variable $_exception ( >> https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Catchpoints.html ). >> >> Currently, when using these features with a libstdcxx without SDT probes, we >> get the cryptic error message: >> ... >> not stopped at a C++ exception catchpoint >> ... >> >> Improve this by instead emitting the more helpful: >> ... >> did not find exception probe (does libstdcxx have SDT probes?) >> ... >> >> Tested on x86_64-linux. >> >> OK for trunk? > > Thanks for the patch. > >> Thanks, >> - Tom >> >> [gdb, c++] Improve error message when using libstdcxx without SDT probes >> >> gdb/ChangeLog: >> >> 2019-07-25 Tom de Vries >> >> PR c++/24852 >> * break-catch-throw.c (fetch_probe_arguments): Improve error mesage >> when pc_probe.prob == NULL. >> >> gdb/testsuite/ChangeLog: >> >> 2019-07-25 Tom de Vries >> >> PR c++/24852 >> * gdb.cp/no-libstdcxx-probe.exp: New test. >> >> --- >> gdb/break-catch-throw.c | 6 ++- >> gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp | 58 +++++++++++++++++++++++++++++ >> 2 files changed, 62 insertions(+), 2 deletions(-) >> >> diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c >> index 0677a55ee5..2d91285312 100644 >> --- a/gdb/break-catch-throw.c >> +++ b/gdb/break-catch-throw.c >> @@ -106,8 +106,10 @@ fetch_probe_arguments (struct value **arg0, struct value **arg1) >> unsigned n_args; >> >> pc_probe = find_probe_by_pc (pc); >> - if (pc_probe.prob == NULL >> - || pc_probe.prob->get_provider () != "libstdcxx" >> + if (pc_probe.prob == NULL) >> + error (_("did not find exception probe (does libstdcxx have SDT probes?)")); >> + >> + if (pc_probe.prob->get_provider () != "libstdcxx" >> || (pc_probe.prob->get_name () != "catch" >> && pc_probe.prob->get_name () != "throw" >> && pc_probe.prob->get_name () != "rethrow")) >> diff --git a/gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp b/gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp >> new file mode 100644 >> index 0000000000..4c1a706ae0 >> --- /dev/null >> +++ b/gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp >> @@ -0,0 +1,58 @@ >> +# Copyright 2019 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 . >> + >> +standard_testfile exceptprint.cc >> + >> +if {[skip_cplus_tests]} { >> + return -1 >> +} >> + >> +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} { >> + return -1 >> +} >> + >> +if {![runto_main]} { >> + return -1 >> +} >> + >> +set libstdcxx_probe_tests_supported [skip_libstdcxx_probe_tests] > > Not your fault, but this reversed logic (skip_libstdcxx_probe_tests > returns 0 if the tests should be skipped) is kinda confusing. > [ FTR, dealt with here ( https://sourceware.org/ml/gdb-patches/2019-08/msg00595.html ). ] >> + >> +if { $libstdcxx_probe_tests_supported == 1 } { >> + untested "Have libstdc++ stap probe" >> + return -1 >> +} >> + >> +proc do_continue_to_catchpoint {name} { >> + global gdb_prompt >> + >> + gdb_test_multiple "continue" $name { >> + -re "Continuing.*Catchpoint \[0-9\].*\r\n$gdb_prompt $" { > > You can use $decimal instead of \[0-9\] if you want. > Done. >> + pass $name >> + } >> + } >> +} >> + >> +proc do_exceptprint_tests {prefix output} { >> + with_test_prefix $prefix { >> + do_continue_to_catchpoint "continue to throw" >> + gdb_test "print \$_exception" \ >> + "did not find exception probe \\(does libstdcxx have SDT probes\\?\\).*" >> + } >> +} > > You don't seem to use $output here. > Hmm, and also prefix doesn't make much sense. In fact, the code becomes more clear if I just inline the procs, and replace the gdb_test_multiple with gdb_test. >> + >> +gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \ >> + "catch throw" > > $decimal if you want. > Done. >> + >> +do_exceptprint_tests string "$hex \"hi bob\"" > > The patch looks good to me. Thanks for doing this. Committed as below. Thanks, - Tom --------------ECEEFD63C94A63A70B4DCDE2 Content-Type: text/x-patch; name="0001-gdb-c-Improve-error-message-when-using-libstdcxx-without-SDT-probes.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename*0="0001-gdb-c-Improve-error-message-when-using-libstdcxx-withou"; filename*1="t-SDT-probes.patch" Content-length: 3320 [gdb, c++] Improve error message when using libstdcxx without SDT probes When using catch catch/rethrow/catch, a libstdcxx with SDT probes is required for both the regexp argument, and the convenience variable $_exception ( https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Catchpoints.html ). Currently, when using these features with a libstdcxx without SDT probes, we get the cryptic error message: ... not stopped at a C++ exception catchpoint ... Improve this by instead emitting the more helpful: ... did not find exception probe (does libstdcxx have SDT probes?) ... Tested on x86_64-linux. gdb/ChangeLog: 2019-07-25 Tom de Vries PR c++/24852 * break-catch-throw.c (fetch_probe_arguments): Improve error mesage when pc_probe.prob == NULL. gdb/testsuite/ChangeLog: 2019-07-25 Tom de Vries PR c++/24852 * gdb.cp/no-libstdcxx-probe.exp: New test. --- gdb/break-catch-throw.c | 6 +++-- gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp | 41 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/gdb/break-catch-throw.c b/gdb/break-catch-throw.c index 0677a55ee5..2d91285312 100644 --- a/gdb/break-catch-throw.c +++ b/gdb/break-catch-throw.c @@ -106,8 +106,10 @@ fetch_probe_arguments (struct value **arg0, struct value **arg1) unsigned n_args; pc_probe = find_probe_by_pc (pc); - if (pc_probe.prob == NULL - || pc_probe.prob->get_provider () != "libstdcxx" + if (pc_probe.prob == NULL) + error (_("did not find exception probe (does libstdcxx have SDT probes?)")); + + if (pc_probe.prob->get_provider () != "libstdcxx" || (pc_probe.prob->get_name () != "catch" && pc_probe.prob->get_name () != "throw" && pc_probe.prob->get_name () != "rethrow")) diff --git a/gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp b/gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp new file mode 100644 index 0000000000..79826ea2d2 --- /dev/null +++ b/gdb/testsuite/gdb.cp/no-libstdcxx-probe.exp @@ -0,0 +1,41 @@ +# Copyright 2019 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 . + +standard_testfile exceptprint.cc + +if {[skip_cplus_tests]} { + return -1 +} + +if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} { + return -1 +} + +if {![runto_main]} { + return -1 +} + +if { [skip_libstdcxx_probe_tests] == 0 } { + untested "Have libstdc++ stap probe" + return -1 +} + +gdb_test "catch throw" "Catchpoint $decimal \\(throw\\)" \ + "catch throw" + +gdb_test "continue" "Continuing.*Catchpoint $decimal.*" + +gdb_test "print \$_exception" \ + "did not find exception probe \\(does libstdcxx have SDT probes\\?\\).*" --------------ECEEFD63C94A63A70B4DCDE2--