Bug 31577

Summary: [gdb] terminate called after throwing an instance of 'gdb_exception_error'
Product: gdb Reporter: Tom de Vries <vries>
Component: remoteAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P2    
Version: HEAD   
Target Milestone: 15.1   
Host: Target:
Build: Last reconfirmed:

Description Tom de Vries 2024-03-29 09:34:29 UTC
I ran test-case gdb.server/connect-with-no-symbol-file.exp in an opensuse leap 15.5 container on an fedora asahi aarch64-linux system.

I ran into:
...
(gdb) detach^M
Detaching from program: target:/data/vries/gdb/build/gdb/testsuite/outputs/gdb.server/connect-with-no-symbol-file/connect-with-no-symbol-file, process 185104^M
Ending remote debugging.^M
terminate called after throwing an instance of 'gdb_exception_error'^M
^M
^M
Fatal signal: Aborted^M
----- Backtrace -----^M
0x5b6603 gdb_internal_backtrace_1^M
        /data/vries/gdb/src/gdb/bt-utils.c:121^M
0x5b66c3 _Z22gdb_internal_backtracev^M
        /data/vries/gdb/src/gdb/bt-utils.c:167^M
0x7a85d3 handle_fatal_signal^M
        /data/vries/gdb/src/gdb/event-top.c:903^M
0xffff75aa87ff ???^M
0xffff74b977b4 ???^M
0xffff74b98c17 ???^M
0xffff74ea26f3 ???^M
0xffff74ea011b ???^M
0xffff74ea017f ???^M
0xffff74ea0463 ???^M
0x154886f throw_it^M
        /data/vries/gdb/src/gdbsupport/common-exceptions.cc:203^M
0x154891f _Z12throw_verror6errorsPKcSt9__va_list^M
        /data/vries/gdb/src/gdbsupport/common-exceptions.cc:211^M
0x15489ff _Z11throw_error6errorsPKcz^M
        /data/vries/gdb/src/gdbsupport/common-exceptions.cc:226^M
0xac8f2b _ZN13remote_target8readcharEi^M
        /data/vries/gdb/src/gdb/remote.c:9856^M
0xac9f03 _ZN13remote_target6getpktEPSt6vectorIcN3gdb22default_init_allocatorIcSaIcEEEEbPb^M
        /data/vries/gdb/src/gdb/remote.c:10326^M
0xacf3cf _ZN13remote_target26remote_hostio_send_commandEiiP12fileio_errorPPKcPi^M
        /data/vries/gdb/src/gdb/remote.c:12567^M
0xad03bb _ZN13remote_target12fileio_fstatEiP4statP12fileio_error^M
        /data/vries/gdb/src/gdb/remote.c:12979^M
0xc39877 _Z19target_fileio_fstatiP4statP12fileio_error^M
        /data/vries/gdb/src/gdb/target.c:3315^M
0x7eee5b _ZN20target_fileio_stream4statEP3bfdP4stat^M
        /data/vries/gdb/src/gdb/gdb_bfd.c:467^M
0x7f012b operator()^M
        /data/vries/gdb/src/gdb/gdb_bfd.c:955^M
0x7f015b _FUN^M
        /data/vries/gdb/src/gdb/gdb_bfd.c:956^M
0xf9b837 opncls_bstat^M
        /data/vries/gdb/src/bfd/opncls.c:665^M
---------------------^M
A fatal error internal to GDB has been detected, further^M
debugging is not possible.  GDB will now terminate.^M
This is a bug, please report it.  For instructions, see:^M
<https://www.gnu.org/software/gdb/bugs/>.^M
^M
ERROR: GDB process no longer exists
GDB process exited with wait status 185065 exp84 0 0 CHILDKILLED SIGABRT SIGABRT
UNRESOLVED: gdb.server/connect-with-no-symbol-file.exp: sysroot=target:: action=permission: detach
...
Comment 1 Tom de Vries 2024-03-29 09:39:17 UTC
Backtrace of the corefile:
...
(gdb) bt
#0  0x0000ffff75504f54 in raise () from /lib64/libpthread.so.0
#1  0x00000000007a86b4 in handle_fatal_signal (sig=6)
    at /data/vries/gdb/src/gdb/event-top.c:926
#2  <signal handler called>
#3  0x0000ffff74b977b4 in raise () from /lib64/libc.so.6
#4  0x0000ffff74b98c18 in abort () from /lib64/libc.so.6
#5  0x0000ffff74ea26f4 in __gnu_cxx::__verbose_terminate_handler() ()
   from /usr/lib64/libstdc++.so.6
#6  0x0000ffff74ea011c in ?? () from /usr/lib64/libstdc++.so.6
#7  0x0000ffff74ea0180 in std::terminate() () from /usr/lib64/libstdc++.so.6
#8  0x0000ffff74ea0464 in __cxa_throw () from /usr/lib64/libstdc++.so.6
#9  0x0000000001548870 in throw_it (reason=RETURN_ERROR, error=TARGET_CLOSE_ERROR, 
    fmt=0x16c7810 "Remote connection closed", ap=...)
    at /data/vries/gdb/src/gdbsupport/common-exceptions.cc:203
#10 0x0000000001548920 in throw_verror (error=TARGET_CLOSE_ERROR, 
    fmt=0x16c7810 "Remote connection closed", ap=...)
    at /data/vries/gdb/src/gdbsupport/common-exceptions.cc:211
#11 0x0000000001548a00 in throw_error (error=TARGET_CLOSE_ERROR, 
    fmt=0x16c7810 "Remote connection closed")
    at /data/vries/gdb/src/gdbsupport/common-exceptions.cc:226
#12 0x0000000000ac8f2c in remote_target::readchar (this=0x233d3d90, timeout=2)
    at /data/vries/gdb/src/gdb/remote.c:9856
#13 0x0000000000ac9f04 in remote_target::getpkt (this=0x233d3d90, buf=0x233d40a8, 
    forever=false, is_notif=0x0) at /data/vries/gdb/src/gdb/remote.c:10326
#14 0x0000000000acf3d0 in remote_target::remote_hostio_send_command (this=0x233d3d90, 
    command_bytes=13, which_packet=17, remote_errno=0xfffff1a3cf38, 
    attachment=0xfffff1a3ce88, attachment_len=0xfffff1a3ce90)
    at /data/vries/gdb/src/gdb/remote.c:12567
#15 0x0000000000ad03bc in remote_target::fileio_fstat (this=0x233d3d90, fd=3, 
    st=0xfffff1a3d020, remote_errno=0xfffff1a3cf38)
    at /data/vries/gdb/src/gdb/remote.c:12979
#16 0x0000000000c39878 in target_fileio_fstat (fd=0, sb=0xfffff1a3d020, 
    target_errno=0xfffff1a3cf38) at /data/vries/gdb/src/gdb/target.c:3315
#17 0x00000000007eee5c in target_fileio_stream::stat (this=0x233d4400, abfd=0x2323fc40, 
    sb=0xfffff1a3d020) at /data/vries/gdb/src/gdb/gdb_bfd.c:467
#18 0x00000000007f012c in <lambda(bfd*, void*, stat*)>::operator()(bfd *, void *, stat *) const (__closure=0x0, abfd=0x2323fc40, stream=0x233d4400, sb=0xfffff1a3d020)
    at /data/vries/gdb/src/gdb/gdb_bfd.c:955
#19 0x00000000007f015c in <lambda(bfd*, void*, stat*)>::_FUN(bfd *, void *, stat *) ()
    at /data/vries/gdb/src/gdb/gdb_bfd.c:956
#20 0x0000000000f9b838 in opncls_bstat (abfd=0x2323fc40, sb=0xfffff1a3d020)
    at /data/vries/gdb/src/bfd/opncls.c:665
#21 0x0000000000f90adc in bfd_stat (abfd=0x2323fc40, statbuf=0xfffff1a3d020)
    at /data/vries/gdb/src/bfd/bfdio.c:431
#22 0x000000000065fe20 in reopen_exec_file () at /data/vries/gdb/src/gdb/corefile.c:52
#23 0x0000000000c3a3e8 in generic_mourn_inferior ()
    at /data/vries/gdb/src/gdb/target.c:3642
#24 0x0000000000abf3f0 in remote_unpush_target (target=0x233d3d90)
    at /data/vries/gdb/src/gdb/remote.c:6067
#25 0x0000000000aca8b0 in remote_target::mourn_inferior (this=0x233d3d90)
    at /data/vries/gdb/src/gdb/remote.c:10587
#26 0x0000000000c387cc in target_mourn_inferior (
    ptid=<error reading variable: Cannot access memory at address 0x2d310>)
    at /data/vries/gdb/src/gdb/target.c:2738
#27 0x0000000000abfff0 in remote_target::remote_detach_1 (this=0x233d3d90, 
    inf=0x22fce540, from_tty=1) at /data/vries/gdb/src/gdb/remote.c:6421
#28 0x0000000000ac0094 in remote_target::detach (this=0x233d3d90, inf=0x22fce540, 
    from_tty=1) at /data/vries/gdb/src/gdb/remote.c:6436
#29 0x0000000000c37c3c in target_detach (inf=0x22fce540, from_tty=1)
    at /data/vries/gdb/src/gdb/target.c:2526
#30 0x0000000000860424 in detach_command (args=0x0, from_tty=1)
    at /data/vries/gdb/src/gdb/infcmd.c:2817
#31 0x000000000060b594 in do_simple_func (args=0x0, from_tty=1, c=0x231431a0)
    at /data/vries/gdb/src/gdb/cli/cli-decode.c:94
#32 0x00000000006108c8 in cmd_func (cmd=0x231431a0, args=0x0, from_tty=1)
    at /data/vries/gdb/src/gdb/cli/cli-decode.c:2741
#33 0x0000000000c65a94 in execute_command (p=0x232e52f6 "", from_tty=1)
    at /data/vries/gdb/src/gdb/top.c:570
#34 0x00000000007a7d2c in command_handler (command=0x232e52f0 "")
    at /data/vries/gdb/src/gdb/event-top.c:566
#35 0x00000000007a8290 in command_line_handler (rl=...)
    at /data/vries/gdb/src/gdb/event-top.c:802
#36 0x0000000000c9092c in tui_command_line_handler (rl=...)
    at /data/vries/gdb/src/gdb/tui/tui-interp.c:103
#37 0x00000000007a750c in gdb_rl_callback_handler (rl=0x23385330 "detach")
    at /data/vries/gdb/src/gdb/event-top.c:258
#38 0x0000000000d910f4 in rl_callback_read_char ()
    at /data/vries/gdb/src/readline/readline/callback.c:290
#39 0x00000000007a7338 in gdb_rl_callback_read_char_wrapper_noexcept ()
    at /data/vries/gdb/src/gdb/event-top.c:194
#40 0x00000000007a73f0 in gdb_rl_callback_read_char_wrapper (client_data=0x22fbf640)
    at /data/vries/gdb/src/gdb/event-top.c:233
#41 0x0000000000cbee1c in stdin_event_handler (error=0, client_data=0x22fbf640)
    at /data/vries/gdb/src/gdb/ui.c:154
#42 0x000000000154ed60 in handle_file_event (file_ptr=0x232be730, ready_mask=1)
    at /data/vries/gdb/src/gdbsupport/event-loop.cc:572
#43 0x000000000154f21c in gdb_wait_for_event (block=1)
    at /data/vries/gdb/src/gdbsupport/event-loop.cc:693
#44 0x000000000154dec4 in gdb_do_one_event (mstimeout=-1)
    at /data/vries/gdb/src/gdbsupport/event-loop.cc:263
#45 0x0000000000910f98 in start_event_loop () at /data/vries/gdb/src/gdb/main.c:400
#46 0x0000000000911130 in captured_command_loop () at /data/vries/gdb/src/gdb/main.c:464
#47 0x0000000000912b5c in captured_main (data=0xfffff1a3db58)
    at /data/vries/gdb/src/gdb/main.c:1338
#48 0x0000000000912bf4 in gdb_main (args=0xfffff1a3db58)
    at /data/vries/gdb/src/gdb/main.c:1357
#49 0x00000000004170f4 in main (argc=10, argv=0xfffff1a3dcc8)
    at /data/vries/gdb/src/gdb/gdb.c:38
(gdb) 
...
Comment 2 Tom de Vries 2024-03-29 09:39:42 UTC
FTR, this is at commit b58829cdeff ("x86/SSE2AVX: move checking").
Comment 3 Tom de Vries 2024-04-19 08:14:22 UTC
Something like this fixes it:
...
diff --git a/gdb/remote.c b/gdb/remote.c
index 5c9fdebcdbe..3de4a0bae80 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -12574,8 +12574,20 @@ remote_target::remote_hostio_send_command (int command_bytes, int which_packet,
       return -1;
     }
 
-  putpkt_binary (rs->buf.data (), command_bytes);
-  bytes_read = getpkt (&rs->buf);
+  try
+    {
+      putpkt_binary (rs->buf.data (), command_bytes);
+      bytes_read = getpkt (&rs->buf);
+    }
+  catch (const gdb_exception &ex)
+    {
+      if (ex.error == TARGET_CLOSE_ERROR)
+       {
+         *remote_errno = FILEIO_EIO;
+         return -1;
+       }
+      throw;
+    }
 
   /* If it timed out, something is wrong.  Don't try to parse the
      buffer.  */
...

But it remains unclear to me at what point exactly we should catch this.

Here?  Down in getpkt?  Up in detach_command?
Comment 4 Tom de Vries 2024-04-19 09:11:02 UTC
Passes with -fexceptions.

So, this is about a c++ exception reaching c code compiled without -fexceptions, and terminating.

This is a fix that catches the exception just before reaching c code:
...
diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c
index 1462aaf0f89..1a29b83eb2c 100644
--- a/gdb/gdb_bfd.c
+++ b/gdb/gdb_bfd.c
@@ -951,8 +951,15 @@ gdb_bfd_openr_iovec (const char *filename, const char *target,
   auto stat_trampoline = [] (struct bfd *abfd, void *stream,
                             struct stat *sb) -> int
   {
-    gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
-    return obj->stat (abfd, sb);
+    try
+      {
+       gdb_bfd_iovec_base *obj = static_cast<gdb_bfd_iovec_base *> (stream);
+       return obj->stat (abfd, sb);
+      }
+    catch (const gdb_exception_error &)
+      {
+       return -1;
+      }
   };
 
   auto close_trampoline = [] (struct bfd *nbfd, void *stream) -> int
...
Comment 6 Sourceware Commits 2024-04-27 15:48:18 UTC
The master branch has been updated by Tom de Vries <vries@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e705ee1621d35af5d05bf40b8653fe9d4be2be09

commit e705ee1621d35af5d05bf40b8653fe9d4be2be09
Author: Tom de Vries <tdevries@suse.de>
Date:   Sat Apr 27 17:48:22 2024 +0200

    [gdb/remote] Fix abort on REMOTE_CLOSE_ERROR
    
    When running test-case gdb.server/connect-with-no-symbol-file.exp on
    aarch64-linux (specifically, an opensuse leap 15.5 container on a
    fedora asahi 39 system), I run into:
    ...
    (gdb) detach^M
    Detaching from program: target:connect-with-no-symbol-file, process 185104^M
    Ending remote debugging.^M
    terminate called after throwing an instance of 'gdb_exception_error'^M
    ...
    
    The detailed backtrace of the corefile is:
    ...
     (gdb) bt
     #0  0x0000ffff75504f54 in raise () from /lib64/libpthread.so.0
     #1  0x00000000007a86b4 in handle_fatal_signal (sig=6)
         at gdb/event-top.c:926
     #2  <signal handler called>
     #3  0x0000ffff74b977b4 in raise () from /lib64/libc.so.6
     #4  0x0000ffff74b98c18 in abort () from /lib64/libc.so.6
     #5  0x0000ffff74ea26f4 in __gnu_cxx::__verbose_terminate_handler() ()
        from /usr/lib64/libstdc++.so.6
     #6  0x0000ffff74ea011c in ?? () from /usr/lib64/libstdc++.so.6
     #7  0x0000ffff74ea0180 in std::terminate() () from /usr/lib64/libstdc++.so.6
     #8  0x0000ffff74ea0464 in __cxa_throw () from /usr/lib64/libstdc++.so.6
     #9  0x0000000001548870 in throw_it (reason=RETURN_ERROR,
         error=TARGET_CLOSE_ERROR, fmt=0x16c7810 "Remote connection closed", ap=...)
         at gdbsupport/common-exceptions.cc:203
     #10 0x0000000001548920 in throw_verror (error=TARGET_CLOSE_ERROR,
         fmt=0x16c7810 "Remote connection closed", ap=...)
         at gdbsupport/common-exceptions.cc:211
     #11 0x0000000001548a00 in throw_error (error=TARGET_CLOSE_ERROR,
         fmt=0x16c7810 "Remote connection closed")
         at gdbsupport/common-exceptions.cc:226
     #12 0x0000000000ac8f2c in remote_target::readchar (this=0x233d3d90, timeout=2)
         at gdb/remote.c:9856
     #13 0x0000000000ac9f04 in remote_target::getpkt (this=0x233d3d90,
         buf=0x233d40a8, forever=false, is_notif=0x0) at gdb/remote.c:10326
     #14 0x0000000000acf3d0 in remote_target::remote_hostio_send_command
         (this=0x233d3d90, command_bytes=13, which_packet=17,
         remote_errno=0xfffff1a3cf38, attachment=0xfffff1a3ce88,
         attachment_len=0xfffff1a3ce90) at gdb/remote.c:12567
     #15 0x0000000000ad03bc in remote_target::fileio_fstat (this=0x233d3d90, fd=3,
         st=0xfffff1a3d020, remote_errno=0xfffff1a3cf38)
         at gdb/remote.c:12979
     #16 0x0000000000c39878 in target_fileio_fstat (fd=0, sb=0xfffff1a3d020,
         target_errno=0xfffff1a3cf38) at gdb/target.c:3315
     #17 0x00000000007eee5c in target_fileio_stream::stat (this=0x233d4400,
         abfd=0x2323fc40, sb=0xfffff1a3d020) at gdb/gdb_bfd.c:467
     #18 0x00000000007f012c in <lambda(bfd*, void*, stat*)>::operator()(bfd *,
         void *, stat *) const (__closure=0x0, abfd=0x2323fc40, stream=0x233d4400,
         sb=0xfffff1a3d020) at gdb/gdb_bfd.c:955
     #19 0x00000000007f015c in <lambda(bfd*, void*, stat*)>::_FUN(bfd *, void *,
         stat *) () at gdb/gdb_bfd.c:956
     #20 0x0000000000f9b838 in opncls_bstat (abfd=0x2323fc40, sb=0xfffff1a3d020)
         at bfd/opncls.c:665
     #21 0x0000000000f90adc in bfd_stat (abfd=0x2323fc40, statbuf=0xfffff1a3d020)
         at bfd/bfdio.c:431
     #22 0x000000000065fe20 in reopen_exec_file () at gdb/corefile.c:52
     #23 0x0000000000c3a3e8 in generic_mourn_inferior ()
         at gdb/target.c:3642
     #24 0x0000000000abf3f0 in remote_unpush_target (target=0x233d3d90)
         at gdb/remote.c:6067
     #25 0x0000000000aca8b0 in remote_target::mourn_inferior (this=0x233d3d90)
         at gdb/remote.c:10587
     #26 0x0000000000c387cc in target_mourn_inferior (
         ptid=<error reading variable: Cannot access memory at address 0x2d310>)
         at gdb/target.c:2738
     #27 0x0000000000abfff0 in remote_target::remote_detach_1 (this=0x233d3d90,
         inf=0x22fce540, from_tty=1) at gdb/remote.c:6421
     #28 0x0000000000ac0094 in remote_target::detach (this=0x233d3d90,
         inf=0x22fce540, from_tty=1) at gdb/remote.c:6436
     #29 0x0000000000c37c3c in target_detach (inf=0x22fce540, from_tty=1)
         at gdb/target.c:2526
     #30 0x0000000000860424 in detach_command (args=0x0, from_tty=1)
        at gdb/infcmd.c:2817
     #31 0x000000000060b594 in do_simple_func (args=0x0, from_tty=1, c=0x231431a0)
         at gdb/cli/cli-decode.c:94
     #32 0x00000000006108c8 in cmd_func (cmd=0x231431a0, args=0x0, from_tty=1)
         at gdb/cli/cli-decode.c:2741
     #33 0x0000000000c65a94 in execute_command (p=0x232e52f6 "", from_tty=1)
         at gdb/top.c:570
     #34 0x00000000007a7d2c in command_handler (command=0x232e52f0 "")
         at gdb/event-top.c:566
     #35 0x00000000007a8290 in command_line_handler (rl=...)
         at gdb/event-top.c:802
     #36 0x0000000000c9092c in tui_command_line_handler (rl=...)
         at gdb/tui/tui-interp.c:103
     #37 0x00000000007a750c in gdb_rl_callback_handler (rl=0x23385330 "detach")
         at gdb/event-top.c:258
     #38 0x0000000000d910f4 in rl_callback_read_char ()
         at readline/readline/callback.c:290
     #39 0x00000000007a7338 in gdb_rl_callback_read_char_wrapper_noexcept ()
         at gdb/event-top.c:194
     #40 0x00000000007a73f0 in gdb_rl_callback_read_char_wrapper
         (client_data=0x22fbf640) at gdb/event-top.c:233
     #41 0x0000000000cbee1c in stdin_event_handler (error=0, client_data=0x22fbf640)
         at gdb/ui.c:154
     #42 0x000000000154ed60 in handle_file_event (file_ptr=0x232be730, ready_mask=1)
         at gdbsupport/event-loop.cc:572
     #43 0x000000000154f21c in gdb_wait_for_event (block=1)
         at gdbsupport/event-loop.cc:693
     #44 0x000000000154dec4 in gdb_do_one_event (mstimeout=-1)
        at gdbsupport/event-loop.cc:263
     #45 0x0000000000910f98 in start_event_loop () at gdb/main.c:400
     #46 0x0000000000911130 in captured_command_loop () at gdb/main.c:464
     #47 0x0000000000912b5c in captured_main (data=0xfffff1a3db58)
         at gdb/main.c:1338
     #48 0x0000000000912bf4 in gdb_main (args=0xfffff1a3db58)
         at gdb/main.c:1357
     #49 0x00000000004170f4 in main (argc=10, argv=0xfffff1a3dcc8)
         at gdb/gdb.c:38
     (gdb)
    ...
    
    The abort happens because a c++ exception escapes to c code, specifically
    opncls_bstat in bfd/opncls.c.  Compiling with -fexceptions works around this.
    
    Fix this by catching the exception just before it escapes, in stat_trampoline
    and likewise in few similar spot.
    
    Add a new template catch_exceptions to do so in a consistent way.
    
    Tested on aarch64-linux.
    
    Approved-by: Pedro Alves <pedro@palves.net>
    
    PR remote/31577
    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31577
Comment 7 Tom de Vries 2024-04-27 15:50:00 UTC
Fixed.