* [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes
@ 2019-07-25 21:04 Tom de Vries
2019-07-26 21:00 ` Tom Tromey
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Tom de Vries @ 2019-07-25 21:04 UTC (permalink / raw)
To: gdb-patches
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,
- Tom
[gdb, c++] Improve error message when using libstdcxx without SDT probes
gdb/ChangeLog:
2019-07-25 Tom de Vries <tdevries@suse.de>
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 <tdevries@suse.de>
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 <http://www.gnu.org/licenses/>.
+
+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]
+
+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 $" {
+ 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\\?\\).*"
+ }
+}
+
+gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \
+ "catch throw"
+
+do_exceptprint_tests string "$hex \"hi bob\""
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes 2019-07-25 21:04 [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes Tom de Vries @ 2019-07-26 21:00 ` Tom Tromey 2019-08-13 13:51 ` [PING][PATCH][gdb, " Tom de Vries 2019-08-26 14:11 ` [PATCH][gdb, " Sergio Durigan Junior 2 siblings, 0 replies; 8+ messages in thread From: Tom Tromey @ 2019-07-26 21:00 UTC (permalink / raw) To: Tom de Vries; +Cc: gdb-patches >>>>> "Tom" == Tom de Vries <tdevries@suse.de> writes: Tom> When using catch catch/rethrow/catch, a libstdcxx with SDT probes is required Tom> for both the regexp argument, and the convenience variable $_exception ( Tom> https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Catchpoints.html ). Tom> + if (pc_probe.prob == NULL) Tom> + error (_("did not find exception probe (does libstdcxx have SDT probes?)")); I think it's more normal to start an error with a capital letter. Also I'd suggest writing "libstdc++" here. Ok with those changes. thanks, Tom ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PING][PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes 2019-07-25 21:04 [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes Tom de Vries 2019-07-26 21:00 ` Tom Tromey @ 2019-08-13 13:51 ` Tom de Vries 2019-08-26 8:47 ` [PING^2][PATCH][gdb, " Tom de Vries 2019-08-26 14:11 ` [PATCH][gdb, " Sergio Durigan Junior 2 siblings, 1 reply; 8+ messages in thread From: Tom de Vries @ 2019-08-13 13:51 UTC (permalink / raw) To: gdb-patches On 25-07-19 23:04, 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? > Ping. Thanks, - Tom > [gdb, c++] Improve error message when using libstdcxx without SDT probes > > gdb/ChangeLog: > > 2019-07-25 Tom de Vries <tdevries@suse.de> > > 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 <tdevries@suse.de> > > 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 <http://www.gnu.org/licenses/>. > + > +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] > + > +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 $" { > + 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\\?\\).*" > + } > +} > + > +gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \ > + "catch throw" > + > +do_exceptprint_tests string "$hex \"hi bob\"" > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PING^2][PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes 2019-08-13 13:51 ` [PING][PATCH][gdb, " Tom de Vries @ 2019-08-26 8:47 ` Tom de Vries 0 siblings, 0 replies; 8+ messages in thread From: Tom de Vries @ 2019-08-26 8:47 UTC (permalink / raw) To: gdb-patches On 13-08-19 15:51, Tom de Vries wrote: > On 25-07-19 23:04, 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? >> > Ping^2. Thanks, - Tom >> [gdb, c++] Improve error message when using libstdcxx without SDT probes >> >> gdb/ChangeLog: >> >> 2019-07-25 Tom de Vries <tdevries@suse.de> >> >> 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 <tdevries@suse.de> >> >> 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 <http://www.gnu.org/licenses/>. >> + >> +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] >> + >> +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 $" { >> + 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\\?\\).*" >> + } >> +} >> + >> +gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \ >> + "catch throw" >> + >> +do_exceptprint_tests string "$hex \"hi bob\"" >> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes 2019-07-25 21:04 [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes Tom de Vries 2019-07-26 21:00 ` Tom Tromey 2019-08-13 13:51 ` [PING][PATCH][gdb, " Tom de Vries @ 2019-08-26 14:11 ` Sergio Durigan Junior 2019-08-26 16:51 ` [committed][gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true Tom de Vries 2019-08-26 17:27 ` [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes Tom de Vries 2 siblings, 2 replies; 8+ messages in thread From: Sergio Durigan Junior @ 2019-08-26 14:11 UTC (permalink / raw) To: Tom de Vries; +Cc: gdb-patches 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 <tdevries@suse.de> > > 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 <tdevries@suse.de> > > 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 <http://www.gnu.org/licenses/>. > + > +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. > + > +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. > + 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. > + > +gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \ > + "catch throw" $decimal if you want. > + > +do_exceptprint_tests string "$hex \"hi bob\"" The patch looks good to me. Thanks for doing this. -- Sergio GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36 Please send encrypted e-mail if possible http://sergiodj.net/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* [committed][gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true 2019-08-26 14:11 ` [PATCH][gdb, " Sergio Durigan Junior @ 2019-08-26 16:51 ` Tom de Vries 2019-08-26 17:02 ` Sergio Durigan Junior 2019-08-26 17:27 ` [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes Tom de Vries 1 sibling, 1 reply; 8+ messages in thread From: Tom de Vries @ 2019-08-26 16:51 UTC (permalink / raw) To: Sergio Durigan Junior; +Cc: gdb-patches [-- Attachment #1: Type: text/plain, Size: 426 bytes --] [ was: Re: [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes ] On 26-08-19 16:11, Sergio Durigan Junior wrote: >> +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. > It's also confusing me. Fixed in attached patch. Committed. Thanks, - Tom [-- Attachment #2: 0001-gdb-testsuite-Make-skip_libstdcxx_probe_tests-return-1-if-true.patch --] [-- Type: text/x-patch, Size: 2878 bytes --] [gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true The tcl proc skip_libstdcxx_probe_tests currently returns 0 if the probe tests need to be skipped, while tcl interprets 0 as false rather than true, which is confusing. Fix this by making skip_libstdcxx_probe_tests return 1 if the probe tests need to be skipped. Tested on x86_64-linux. gdb/testsuite/ChangeLog: 2019-08-26 Tom de Vries <tdevries@suse.de> * lib/gdb.exp (skip_libstdcxx_probe_tests_prompt): Return 1 if probe * tests need to be skipped. * gdb.cp/exceptprint.exp: Update call to skip_libstdcxx_probe_tests. * gdb.mi/mi-catch-cpp-exceptions.exp: Update call to mi_skip_libstdcxx_probe_tests. --- gdb/testsuite/gdb.cp/exceptprint.exp | 2 +- gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp | 2 +- gdb/testsuite/lib/gdb.exp | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/gdb/testsuite/gdb.cp/exceptprint.exp b/gdb/testsuite/gdb.cp/exceptprint.exp index 46378d1b69..f6dcd0f5bd 100644 --- a/gdb/testsuite/gdb.cp/exceptprint.exp +++ b/gdb/testsuite/gdb.cp/exceptprint.exp @@ -27,7 +27,7 @@ if {![runto_main]} { return -1 } -if {![skip_libstdcxx_probe_tests]} { +if {[skip_libstdcxx_probe_tests]} { untested "could not find libstdc++ stap probe" return -1 } diff --git a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp index 029dc1bd02..2951497882 100644 --- a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp +++ b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp @@ -36,7 +36,7 @@ mi_gdb_load ${binfile} if {![mi_run_to_main]} { return -1 } -set libstdcxx_probe_tests_supported [mi_skip_libstdcxx_probe_tests] +set libstdcxx_probe_tests_supported [expr ![mi_skip_libstdcxx_probe_tests]] # Grab some line numbers we'll need. set catch_1_lineno [gdb_get_line_number "Catch 1"] diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index af56e8aa12..76805fb5ec 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -3158,20 +3158,21 @@ proc skip_unwinder_tests {} { return $ok } -# Return 0 if we should skip tests that require the libstdc++ stap +# Return 1 if we should skip tests that require the libstdc++ stap # probes. This must be invoked while gdb is running, after shared # libraries have been loaded. PROMPT_REGEXP is the expected prompt. proc skip_libstdcxx_probe_tests_prompt { prompt_regexp } { - set ok 0 + set supported 0 gdb_test_multiple "info probe" "check for stap probe in libstdc++" { -re ".*libstdcxx.*catch.*\r\n$prompt_regexp" { - set ok 1 + set supported 1 } -re "\r\n$prompt_regexp" { } } "$prompt_regexp" - return $ok + set skip [expr !$supported] + return $skip } # As skip_libstdcxx_probe_tests_prompt, with gdb_prompt. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [committed][gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true 2019-08-26 16:51 ` [committed][gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true Tom de Vries @ 2019-08-26 17:02 ` Sergio Durigan Junior 0 siblings, 0 replies; 8+ messages in thread From: Sergio Durigan Junior @ 2019-08-26 17:02 UTC (permalink / raw) To: Tom de Vries; +Cc: gdb-patches On Monday, August 26 2019, Tom de Vries wrote: > [ was: Re: [PATCH][gdb, c++] Improve error message when using libstdcxx > without SDT probes ] > > On 26-08-19 16:11, Sergio Durigan Junior wrote: >>> +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. >> > > It's also confusing me. > > Fixed in attached patch. Aha, thanks! > Committed. > > Thanks, > - Tom > > [gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true > > The tcl proc skip_libstdcxx_probe_tests currently returns 0 if the probe tests > need to be skipped, while tcl interprets 0 as false rather than true, which is > confusing. > > Fix this by making skip_libstdcxx_probe_tests return 1 if the probe tests need > to be skipped. > > Tested on x86_64-linux. > > gdb/testsuite/ChangeLog: > > 2019-08-26 Tom de Vries <tdevries@suse.de> > > * lib/gdb.exp (skip_libstdcxx_probe_tests_prompt): Return 1 if probe > * tests need to be skipped. > * gdb.cp/exceptprint.exp: Update call to skip_libstdcxx_probe_tests. > * gdb.mi/mi-catch-cpp-exceptions.exp: Update call to > mi_skip_libstdcxx_probe_tests. > > --- > gdb/testsuite/gdb.cp/exceptprint.exp | 2 +- > gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp | 2 +- > gdb/testsuite/lib/gdb.exp | 9 +++++---- > 3 files changed, 7 insertions(+), 6 deletions(-) > > diff --git a/gdb/testsuite/gdb.cp/exceptprint.exp b/gdb/testsuite/gdb.cp/exceptprint.exp > index 46378d1b69..f6dcd0f5bd 100644 > --- a/gdb/testsuite/gdb.cp/exceptprint.exp > +++ b/gdb/testsuite/gdb.cp/exceptprint.exp > @@ -27,7 +27,7 @@ if {![runto_main]} { > return -1 > } > > -if {![skip_libstdcxx_probe_tests]} { > +if {[skip_libstdcxx_probe_tests]} { > untested "could not find libstdc++ stap probe" > return -1 > } > diff --git a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp > index 029dc1bd02..2951497882 100644 > --- a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp > +++ b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp > @@ -36,7 +36,7 @@ mi_gdb_load ${binfile} > if {![mi_run_to_main]} { > return -1 > } > -set libstdcxx_probe_tests_supported [mi_skip_libstdcxx_probe_tests] > +set libstdcxx_probe_tests_supported [expr ![mi_skip_libstdcxx_probe_tests]] > > # Grab some line numbers we'll need. > set catch_1_lineno [gdb_get_line_number "Catch 1"] > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp > index af56e8aa12..76805fb5ec 100644 > --- a/gdb/testsuite/lib/gdb.exp > +++ b/gdb/testsuite/lib/gdb.exp > @@ -3158,20 +3158,21 @@ proc skip_unwinder_tests {} { > return $ok > } > > -# Return 0 if we should skip tests that require the libstdc++ stap > +# Return 1 if we should skip tests that require the libstdc++ stap > # probes. This must be invoked while gdb is running, after shared > # libraries have been loaded. PROMPT_REGEXP is the expected prompt. > > proc skip_libstdcxx_probe_tests_prompt { prompt_regexp } { > - set ok 0 > + set supported 0 > gdb_test_multiple "info probe" "check for stap probe in libstdc++" { > -re ".*libstdcxx.*catch.*\r\n$prompt_regexp" { > - set ok 1 > + set supported 1 > } > -re "\r\n$prompt_regexp" { > } > } "$prompt_regexp" > - return $ok > + set skip [expr !$supported] > + return $skip > } > > # As skip_libstdcxx_probe_tests_prompt, with gdb_prompt. > -- Sergio GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36 Please send encrypted e-mail if possible http://sergiodj.net/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes 2019-08-26 14:11 ` [PATCH][gdb, " Sergio Durigan Junior 2019-08-26 16:51 ` [committed][gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true Tom de Vries @ 2019-08-26 17:27 ` Tom de Vries 1 sibling, 0 replies; 8+ messages in thread From: Tom de Vries @ 2019-08-26 17:27 UTC (permalink / raw) To: Sergio Durigan Junior; +Cc: gdb-patches [-- Attachment #1: Type: text/plain, Size: 4885 bytes --] 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 <tdevries@suse.de> >> >> 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 <tdevries@suse.de> >> >> 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 <http://www.gnu.org/licenses/>. >> + >> +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 [-- Attachment #2: 0001-gdb-c-Improve-error-message-when-using-libstdcxx-without-SDT-probes.patch --] [-- Type: text/x-patch, Size: 3320 bytes --] [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 <tdevries@suse.de> 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 <tdevries@suse.de> 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 <http://www.gnu.org/licenses/>. + +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\\?\\).*" ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2019-08-26 17:27 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-07-25 21:04 [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes Tom de Vries 2019-07-26 21:00 ` Tom Tromey 2019-08-13 13:51 ` [PING][PATCH][gdb, " Tom de Vries 2019-08-26 8:47 ` [PING^2][PATCH][gdb, " Tom de Vries 2019-08-26 14:11 ` [PATCH][gdb, " Sergio Durigan Junior 2019-08-26 16:51 ` [committed][gdb/testsuite] Make skip_libstdcxx_probe_tests return 1 if true Tom de Vries 2019-08-26 17:02 ` Sergio Durigan Junior 2019-08-26 17:27 ` [PATCH][gdb, c++] Improve error message when using libstdcxx without SDT probes Tom de Vries
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox