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 ...
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) ...
FTR, this is at commit b58829cdeff ("x86/SSE2AVX: move checking").
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?
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 ...
https://sourceware.org/pipermail/gdb-patches/2024-April/208302.html
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
Fixed.