public inbox for gdb-prs@sourceware.org
help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <sourceware-bugzilla@sourceware.org>
To: gdb-prs@sourceware.org
Subject: [Bug gdb/28080] detach causes core dump
Date: Tue, 13 Jul 2021 14:35:18 +0000	[thread overview]
Message-ID: <bug-28080-4717-lV66FsfD2z@http.sourceware.org/bugzilla/> (raw)
In-Reply-To: <bug-28080-4717@http.sourceware.org/bugzilla/>

https://sourceware.org/bugzilla/show_bug.cgi?id=28080

--- Comment #5 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The gdb-11-branch branch has been updated by Pedro Alves
<palves@sourceware.org>:

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

commit 3e0910a5f00a5ac9636d54fe9bd216ccac393c99
Author: Pedro Alves <pedro@palves.net>
Date:   Mon Jul 12 18:03:22 2021 +0100

    Avoid letting exceptions escape gdb_bfd_iovec_fileio_close (PR gdb/28080)

    Before PR gdb/28080 was fixed by the previous patch, GDB was crashing
    like this:

     (gdb) detach
     Detaching from program: target:/any/program, process 3671843
     Detaching from process 3671843
     Ending remote debugging.
     [Inferior 1 (process 3671843) detached]
     In main
     terminate called after throwing an instance of 'gdb_exception_error'
     Aborted (core dumped)

    Here's the exception above being thrown:

     (top-gdb) bt
     #0  throw_error (error=TARGET_CLOSE_ERROR, fmt=0x555556035588 "Remote
connection closed") at src/gdbsupport/common-exceptions.cc:222
     #1  0x0000555555bbaa46 in remote_target::readchar (this=0x555556a11040,
timeout=10000) at src/gdb/remote.c:9440
     #2  0x0000555555bbb9e5 in remote_target::getpkt_or_notif_sane_1
(this=0x555556a11040, buf=0x555556a11058, forever=0, expecting_notif=0,
is_notif=0x0) at src/gdb/remote.c:9928
     #3  0x0000555555bbbda9 in remote_target::getpkt_sane (this=0x555556a11040,
buf=0x555556a11058, forever=0) at src/gdb/remote.c:10030
     #4  0x0000555555bc0e75 in remote_target::remote_hostio_send_command
(this=0x555556a11040, command_bytes=13, which_packet=14,
remote_errno=0x7fffffffcfd0, attachment=0x0, attachment_len=0x0) at
src/gdb/remote.c:12137
     #5  0x0000555555bc1b6c in remote_target::remote_hostio_close
(this=0x555556a11040, fd=8, remote_errno=0x7fffffffcfd0) at
src/gdb/remote.c:12455
     #6  0x0000555555bc1bb4 in remote_target::fileio_close (During symbol
reading: .debug_line address at offset 0x64f417 is 0 [in module build/gdb/gdb]
     this=0x555556a11040, fd=8, remote_errno=0x7fffffffcfd0) at
src/gdb/remote.c:12462
     #7  0x0000555555c9274c in target_fileio_close (fd=3,
target_errno=0x7fffffffcfd0) at src/gdb/target.c:3365
     #8  0x000055555595a19d in gdb_bfd_iovec_fileio_close (abfd=0x555556b9f8a0,
stream=0x555556b11530) at src/gdb/gdb_bfd.c:439
     #9  0x0000555555e09e3f in opncls_bclose (abfd=0x555556b9f8a0) at
src/bfd/opncls.c:599
     #10 0x0000555555e0a2c7 in bfd_close_all_done (abfd=0x555556b9f8a0) at
src/bfd/opncls.c:847
     #11 0x0000555555e0a27a in bfd_close (abfd=0x555556b9f8a0) at
src/bfd/opncls.c:814
     #12 0x000055555595a9d3 in gdb_bfd_close_or_warn (abfd=0x555556b9f8a0) at
src/gdb/gdb_bfd.c:626
     #13 0x000055555595ad29 in gdb_bfd_unref (abfd=0x555556b9f8a0) at
src/gdb/gdb_bfd.c:715
     #14 0x0000555555ae4730 in objfile::~objfile (this=0x555556515540,
__in_chrg=<optimized out>) at src/gdb/objfiles.c:573
     #15 0x0000555555ae955a in std::_Sp_counted_ptr<objfile*,
(__gnu_cxx::_Lock_policy)2>::_M_dispose (this=0x555556c20db0) at
/usr/include/c++/9/bits/shared_ptr_base.h:377
     #16 0x000055555572b7c8 in
std::_Sp_counted_base<(__gnu_cxx::_Lock_policy)2>::_M_release
(this=0x555556c20db0) at /usr/include/c++/9/bits/shared_ptr_base.h:155
     #17 0x00005555557263c3 in
std::__shared_count<(__gnu_cxx::_Lock_policy)2>::~__shared_count
(this=0x555556bf0588, __in_chrg=<optimized out>) at
/usr/include/c++/9/bits/shared_ptr_base.h:730
     #18 0x0000555555ae745e in std::__shared_ptr<objfile,
(__gnu_cxx::_Lock_policy)2>::~__shared_ptr (this=0x555556bf0580,
__in_chrg=<optimized out>) at /usr/include/c++/9/bits/shared_ptr_base.h:1169
     #19 0x0000555555ae747e in std::shared_ptr<objfile>::~shared_ptr
(this=0x555556bf0580, __in_chrg=<optimized out>) at
/usr/include/c++/9/bits/shared_ptr.h:103
     #20 0x0000555555b1c1dc in
__gnu_cxx::new_allocator<std::_List_node<std::shared_ptr<objfile> >
>::destroy<std::shared_ptr<objfile> > (this=0x5555564cdd60, __p=0x555556bf0580)
at /usr/include/c++/9/ext/new_allocator.h:153
     #21 0x0000555555b1bb1d in
std::allocator_traits<std::allocator<std::_List_node<std::shared_ptr<objfile> >
> >::destroy<std::shared_ptr<objfile> > (__a=..., __p=0x555556bf0580) at
/usr/include/c++/9/bits/alloc_traits.h:497
     #22 0x0000555555b1b73e in std::__cxx11::list<std::shared_ptr<objfile>,
std::allocator<std::shared_ptr<objfile> > >::_M_erase (this=0x5555564cdd60,
__position=std::shared_ptr<objfile> (expired, weak count 1) = {get() =
0x555556515540}) at /usr/include/c++/9/bits/stl_list.h:1921
     #23 0x0000555555b1afeb in std::__cxx11::list<std::shared_ptr<objfile>,
std::allocator<std::shared_ptr<objfile> > >::erase (this=0x5555564cdd60,
__position=std::shared_ptr<objfile> (expired, weak count 1) = {get() =
0x555556515540}) at /usr/include/c++/9/bits/list.tcc:158
     #24 0x0000555555b19576 in program_space::remove_objfile
(this=0x5555564cdd20, objfile=0x555556515540) at src/gdb/progspace.c:210
     #25 0x0000555555ae4502 in objfile::unlink (this=0x555556515540) at
src/gdb/objfiles.c:487
     #26 0x0000555555ae5a12 in objfile_purge_solibs () at
src/gdb/objfiles.c:875
     #27 0x0000555555c09686 in no_shared_libraries (ignored=0x0, from_tty=1) at
src/gdb/solib.c:1236
     #28 0x00005555559e3f5f in detach_command (args=0x0, from_tty=1) at
src/gdb/infcmd.c:2769

    Note frame #14:

     #14 0x0000555555ae4730 in objfile::~objfile (this=0x555556515540,
__in_chrg=<optimized out>) at src/gdb/objfiles.c:573

    That's a dtor, thus noexcept.  That's the reason for the
    std::terminate.

    The previous patch fixed things such that the exception above isn't
    thrown anymore.  However, it's possible that e.g., the remote
    connection drops just while a user types "nosharedlibrary", or some
    other reason that leads to objfile::~objfile, and then we end up the
    same std::terminate problem.

    Also notice that frames #9-#11 are BFD frames:

     #9  0x0000555555e09e3f in opncls_bclose (abfd=0x555556bc27e0) at
src/bfd/opncls.c:599
     #10 0x0000555555e0a2c7 in bfd_close_all_done (abfd=0x555556bc27e0) at
src/bfd/opncls.c:847
     #11 0x0000555555e0a27a in bfd_close (abfd=0x555556bc27e0) at
src/bfd/opncls.c:814

    BFD is written in C and thus throwing exceptions over such frames may
    either not clean up properly, or, may abort if bfd is not compiled
    with -fasynchronous-unwind-tables (x86-64 defaults that on, but not
    all GCC ports do).

    Thus frame #8 seems like a good place to swallow exceptions.  More so
    since in this spot we already ignore target_fileio_close return
    errors.  That's what this commit does.  Without the previous fix, we'd
    see:

     (gdb) detach
     Detaching from program: target:/any/program, process 2197701
     Ending remote debugging.
     [Inferior 1 (process 2197701) detached]
     warning: cannot close "target:/lib64/ld-linux-x86-64.so.2": Remote
connection closed

    Note it prints a warning, which would still be a regression compared
    to GDB 10, if it weren't for the previous fix.

    gdb/ChangeLog:
    yyyy-mm-dd  Pedro Alves  <pedro@palves.net>

            PR gdb/28080
            * gdb_bfd.c (gdb_bfd_close_warning): New.
            (gdb_bfd_iovec_fileio_close): Wrap target_fileio_close in
            try/catch and print warning on exception.
            (gdb_bfd_close_or_warn): Use gdb_bfd_close_warning.

    Change-Id: Ic7a26ddba0a4444e3377b0e7c1c89934a84545d7

-- 
You are receiving this mail because:
You are on the CC list for the bug.

  parent reply	other threads:[~2021-07-13 14:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-12 15:33 [Bug gdb/28080] New: " jonah at kichwacoders dot com
2021-07-12 16:05 ` [Bug gdb/28080] " simark at simark dot ca
2021-07-12 19:37 ` pedro at palves dot net
2021-07-13 14:32 ` cvs-commit at gcc dot gnu.org
2021-07-13 14:32 ` cvs-commit at gcc dot gnu.org
2021-07-13 14:35 ` cvs-commit at gcc dot gnu.org
2021-07-13 14:35 ` cvs-commit at gcc dot gnu.org [this message]
2021-07-13 14:37 ` pedro at palves dot net
2021-07-13 14:38 ` pedro at palves dot net

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-28080-4717-lV66FsfD2z@http.sourceware.org/bugzilla/ \
    --to=sourceware-bugzilla@sourceware.org \
    --cc=gdb-prs@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).