[gdb] Fix catch throw regexp matching
authorTom de Vries <tdevries@suse.de>
Sat, 9 May 2020 18:17:10 +0000 (20:17 +0200)
committerTom de Vries <tdevries@suse.de>
Sat, 9 May 2020 18:17:10 +0000 (20:17 +0200)
When running test-case gdb.mi/mi-catch-cpp-exceptions.exp, we have:
...
FAIL: gdb.mi/mi-catch-cpp-exceptions.exp: all with invalid regexp: run until \
  breakpoint in main (unknown output after running)
...

This is a regression since commit 596dc4adff "Speed up psymbol reading by
removing a copy".

Before that commit, we have:
...
$ gdb \
    -batch \
    ./outputs/gdb.mi/mi-catch-cpp-exceptions/mi-catch-cpp-exceptions \
    -ex "break 67" \
    -ex "catch throw -r blahblah" \
    -ex r
Breakpoint 1 at 0x4008e5: file mi-catch-cpp-exceptions.cc, line 67.
Catchpoint 2 (throw)

Breakpoint 1, main () at mi-catch-cpp-exceptions.cc:67
67                  return 1;   /* Stop here.  */
...
In other words:
- we set a breakpoint somewhere in main,
- we set a catchpoint with a regexp that is intended to not match any
  exception, and
- run to the breakpoint, without the catchpoint triggering.

After the commit, we have:
...
$ gdb \
    -batch \
    ./outputs/gdb.mi/mi-catch-cpp-exceptions/mi-catch-cpp-exceptions \
    -ex "break 67" \
    -ex "catch throw -r blahblah" \
    -ex r
Breakpoint 1 at 0x4008e5: file mi-catch-cpp-exceptions.cc, line 67.
Catchpoint 2 (throw)

Catchpoint 2 (exception thrown), 0x00007ffff7ab037e in __cxa_throw () from \
  /usr/lib64/libstdc++.so.6
...
In other words, the catchpoint triggers.

This is caused by this bit of the commit:
...
       type_name = cplus_typename_from_type_info (typeinfo_arg);

       canon = cp_canonicalize_string (type_name.c_str ());
-      if (!canon.empty ())
-       std::swap (type_name, canon);
+      name = (canon == nullptr
+       ? canon.get ()
+       : type_name.c_str ());
     }
   catch (const gdb_exception_error &e)
     {
       exception_print (gdb_stderr, e);
     }

-  if (!type_name.empty ())
+  if (name != nullptr)
     {
-      if (self->pattern->exec (type_name.c_str (), 0, NULL, 0) != 0)
+      if (self->pattern->exec (name, 0, NULL, 0) != 0)
...

Before the commit, we have:
- type_name == "my_exception"
- canon = ""
and the !type_name.empty () test succeeds, and gdb executes the
self->pattern->exec call.

After the commit, we have:
- type_name == "my_exception"
- canon == NULL
- name == NULL
and the name != nullptr test fails, and gdb doesn't execute the
self->pattern->exec call.

Fix this by inverting the condition for the calculation of name:
...
-      name = (canon == nullptr
+      name = (canon != nullptr
...

Build and tested on x86_64-linux.

gdb/ChangeLog:

2020-05-09  Tom de Vries  <tdevries@suse.de>

PR gdb/25955
* break-catch-throw.c (check_status_exception_catchpoint): Fix name
calculation.

gdb/ChangeLog
gdb/break-catch-throw.c

index 1abdf9f1db2a5784ea2c3c7d3080036aacc1de02..a132f20dde5944447f4ec41349223a704f506100 100644 (file)
@@ -1,3 +1,9 @@
+2020-05-09  Tom de Vries  <tdevries@suse.de>
+
+       PR gdb/25955
+       * break-catch-throw.c (check_status_exception_catchpoint): Fix name
+       calculation.
+
 2020-05-09  Tom Tromey  <tom@tromey.com>
 
        * top.c (server_command): Now bool.
index 59293c4e57060399b1dbeb3d70f68276434ca110..7f4a9f955dfc7edbb61ac5452a0245f1f9f7dab7 100644 (file)
@@ -166,7 +166,7 @@ check_status_exception_catchpoint (struct bpstats *bs)
       type_name = cplus_typename_from_type_info (typeinfo_arg);
 
       canon = cp_canonicalize_string (type_name.c_str ());
-      name = (canon == nullptr
+      name = (canon != nullptr
              ? canon.get ()
              : type_name.c_str ());
     }