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 record/28086] inferior.c:303: internal-error: inferior* find_inferior _pid(process_stratum_target*, int): Assertion `pid != 0' failed.
Date: Mon, 19 Jul 2021 13:45:34 +0000	[thread overview]
Message-ID: <bug-28086-4717-ELnSmOoifS@http.sourceware.org/bugzilla/> (raw)
In-Reply-To: <bug-28086-4717@http.sourceware.org/bugzilla/>

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

--- Comment #9 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Simon Marchi <simark@sourceware.org>:

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

commit ecd799b189aaf7c04fef0b6c1d74c5ac10ddfc0e
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Wed Jul 14 16:31:09 2021 -0400

    gdb: set current thread in btrace_compute_ftrace_{bts,pt}

    As documented in bug 28086, test gdb.btrace/enable-new-thread.exp
    started failing with commit 0618ae414979 ("gdb: optimize
    all_matching_threads_iterator"):

        (gdb) record btrace^M
        (gdb) PASS: gdb.btrace/enable-new-thread.exp: record btrace
        break 24^M
        Breakpoint 2 at 0x555555555175: file
/home/smarchi/src/binutils-gdb/gdb/testsuite/gdb.btrace/enable-new-thread.c,
line 24.^M
        (gdb) continue^M
        Continuing.^M
        /home/smarchi/src/binutils-gdb/gdb/inferior.c:303: internal-error:
inferior* find_inferior_pid(process_stratum_target*, int): Assertion `pid != 0'
failed.^M
        A problem internal to GDB has been detected,^M
        further debugging may prove unreliable.^M
        Quit this debugging session? (y or n) FAIL:
gdb.btrace/enable-new-thread.exp: continue to breakpoint: cont to bp.1 (GDB
internal error)

    Note that I only see the failure if GDB is compiled without libipt
    support.  This is because GDB then makes use BTS instead of PT, so
    exercises different code paths.

    I think that the commit above just exposed an existing problem.  The
    stack trace of the internal error is:

        #8  0x0000561cb81e404e in internal_error (file=0x561cb83aa2f8
"/home/smarchi/src/binutils-gdb/gdb/inferior.c", line=303, fmt=0x561cb83aa099
"%s: Assertion `%s' failed.") at
/home/smarchi/src/binutils-gdb/gdbsupport/errors.cc:55
        #9  0x0000561cb7b5c031 in find_inferior_pid (targ=0x561cb8aafb60
<the_amd64_linux_nat_target>, pid=0) at
/home/smarchi/src/binutils-gdb/gdb/inferior.c:303
        #10 0x0000561cb7b5c102 in find_inferior_ptid (targ=0x561cb8aafb60
<the_amd64_linux_nat_target>, ptid=...) at
/home/smarchi/src/binutils-gdb/gdb/inferior.c:317
        #11 0x0000561cb7f1d1c3 in find_thread_ptid (targ=0x561cb8aafb60
<the_amd64_linux_nat_target>, ptid=...) at
/home/smarchi/src/binutils-gdb/gdb/thread.c:487
        #12 0x0000561cb7f1b921 in
all_matching_threads_iterator::all_matching_threads_iterator
(this=0x7ffc4ee34678, filter_target=0x561cb8aafb60
<the_amd64_linux_nat_target>, filter_ptid=...) at
/home/smarchi/src/binutils-gdb/gdb/thread-iter.c:125
        #13 0x0000561cb77bc462 in
filtered_iterator<all_matching_threads_iterator,
non_exited_thread_filter>::filtered_iterator<process_stratum_target* const&,
ptid_t const&> (this=0x7ffc4ee34670) at
/home/smarchi/src/binutils-gdb/gdb/../gdbsupport/filtered-iterator.h:42
        #14 0x0000561cb77b97cb in all_non_exited_threads_range::begin
(this=0x7ffc4ee34650) at /home/smarchi/src/binutils-gdb/gdb/thread-iter.h:243
        #15 0x0000561cb7d8ba30 in record_btrace_target::record_is_replaying
(this=0x561cb8aa6250 <record_btrace_ops>, ptid=...) at
/home/smarchi/src/binutils-gdb/gdb/record-btrace.c:1411
        #16 0x0000561cb7d8bb83 in record_btrace_target::xfer_partial
(this=0x561cb8aa6250 <record_btrace_ops>, object=TARGET_OBJECT_MEMORY,
annex=0x0, readbuf=0x7ffc4ee34c58 "\260g\343N\374\177", writebuf=0x0,
offset=140737352774277, len=1, xfered_len=0x7ffc4ee34ad8) at
/home/smarchi/src/binutils-gdb/gdb/record-btrace.c:1437
        #17 0x0000561cb7ef73a9 in raw_memory_xfer_partial (ops=0x561cb8aa6250
<record_btrace_ops>, readbuf=0x7ffc4ee34c58 "\260g\343N\374\177", writebuf=0x0,
memaddr=140737352774277, len=1, xfered_len=0x7ffc4ee34ad8) at
/home/smarchi/src/binutils-gdb/gdb/target.c:1504
        #18 0x0000561cb7ef77da in memory_xfer_partial_1 (ops=0x561cb8aa6250
<record_btrace_ops>, object=TARGET_OBJECT_CODE_MEMORY, readbuf=0x7ffc4ee34c58
"\260g\343N\374\177", writebuf=0x0, memaddr=140737352774277, len=1,
xfered_len=0x7ffc4ee34ad8) at /home/smarchi/src/binutils-gdb/gdb/target.c:1635
        #19 0x0000561cb7ef78b5 in memory_xfer_partial (ops=0x561cb8aa6250
<record_btrace_ops>, object=TARGET_OBJECT_CODE_MEMORY, readbuf=0x7ffc4ee34c58
"\260g\343N\374\177", writebuf=0x0, memaddr=140737352774277, len=1,
xfered_len=0x7ffc4ee34ad8) at /home/smarchi/src/binutils-gdb/gdb/target.c:1664
        #20 0x0000561cb7ef7ba4 in target_xfer_partial (ops=0x561cb8aa6250
<record_btrace_ops>, object=TARGET_OBJECT_CODE_MEMORY, annex=0x0,
readbuf=0x7ffc4ee34c58 "\260g\343N\374\177", writebuf=0x0,
offset=140737352774277, len=1, xfered_len=0x7ffc4ee34ad8) at
/home/smarchi/src/binutils-gdb/gdb/target.c:1721
        #21 0x0000561cb7ef8503 in target_read_partial (ops=0x561cb8aa6250
<record_btrace_ops>, object=TARGET_OBJECT_CODE_MEMORY, annex=0x0,
buf=0x7ffc4ee34c58 "\260g\343N\374\177", offset=140737352774277, len=1,
xfered_len=0x7ffc4ee34ad8) at /home/smarchi/src/binutils-gdb/gdb/target.c:1974
        #22 0x0000561cb7ef861f in target_read (ops=0x561cb8aa6250
<record_btrace_ops>, object=TARGET_OBJECT_CODE_MEMORY, annex=0x0,
buf=0x7ffc4ee34c58 "\260g\343N\374\177", offset=140737352774277, len=1) at
/home/smarchi/src/binutils-gdb/gdb/target.c:2014
        #23 0x0000561cb7ef809f in target_read_code (memaddr=140737352774277,
myaddr=0x7ffc4ee34c58 "\260g\343N\374\177", len=1) at
/home/smarchi/src/binutils-gdb/gdb/target.c:1869
        #24 0x0000561cb7937f4d in gdb_disassembler::dis_asm_read_memory
(memaddr=140737352774277, myaddr=0x7ffc4ee34c58 "\260g\343N\374\177", len=1,
info=0x7ffc4ee34e88) at /home/smarchi/src/binutils-gdb/gdb/disasm.c:139
        #25 0x0000561cb80ab66d in fetch_data (info=0x7ffc4ee34e88,
addr=0x7ffc4ee34c59 "g\343N\374\177") at
/home/smarchi/src/binutils-gdb/opcodes/i386-dis.c:194
        #26 0x0000561cb80ab7e2 in ckprefix () at
/home/smarchi/src/binutils-gdb/opcodes/i386-dis.c:8628
        #27 0x0000561cb80adbd8 in print_insn (pc=140737352774277,
info=0x7ffc4ee34e88) at /home/smarchi/src/binutils-gdb/opcodes/i386-dis.c:9587
        #28 0x0000561cb80abe4f in print_insn_i386 (pc=140737352774277,
info=0x7ffc4ee34e88) at /home/smarchi/src/binutils-gdb/opcodes/i386-dis.c:8894
        #29 0x0000561cb7744a19 in default_print_insn (memaddr=140737352774277,
info=0x7ffc4ee34e88) at /home/smarchi/src/binutils-gdb/gdb/arch-utils.c:1029
        #30 0x0000561cb7b33067 in i386_print_insn (pc=140737352774277,
info=0x7ffc4ee34e88) at /home/smarchi/src/binutils-gdb/gdb/i386-tdep.c:4013
        #31 0x0000561cb7acd8f4 in gdbarch_print_insn (gdbarch=0x561cbae2fb60,
vma=140737352774277, info=0x7ffc4ee34e88) at
/home/smarchi/src/binutils-gdb/gdb/gdbarch.c:3478
        #32 0x0000561cb793a32d in gdb_disassembler::print_insn
(this=0x7ffc4ee34e80, memaddr=140737352774277, branch_delay_insns=0x0) at
/home/smarchi/src/binutils-gdb/gdb/disasm.c:795
        #33 0x0000561cb793a5b0 in gdb_print_insn (gdbarch=0x561cbae2fb60,
memaddr=140737352774277, stream=0x561cb8ac99f8 <null_stream>,
branch_delay_insns=0x0) at /home/smarchi/src/binutils-gdb/gdb/disasm.c:850
        #34 0x0000561cb793a631 in gdb_insn_length (gdbarch=0x561cbae2fb60,
addr=140737352774277) at /home/smarchi/src/binutils-gdb/gdb/disasm.c:859
        #35 0x0000561cb77f53f4 in btrace_compute_ftrace_bts (tp=0x561cbba11210,
btrace=0x7ffc4ee35188, gaps=...) at
/home/smarchi/src/binutils-gdb/gdb/btrace.c:1107
        #36 0x0000561cb77f55f5 in btrace_compute_ftrace_1 (tp=0x561cbba11210,
btrace=0x7ffc4ee35180, cpu=0x0, gaps=...) at
/home/smarchi/src/binutils-gdb/gdb/btrace.c:1527
        #37 0x0000561cb77f5705 in btrace_compute_ftrace (tp=0x561cbba11210,
btrace=0x7ffc4ee35180, cpu=0x0) at
/home/smarchi/src/binutils-gdb/gdb/btrace.c:1560
        #38 0x0000561cb77f583b in btrace_add_pc (tp=0x561cbba11210) at
/home/smarchi/src/binutils-gdb/gdb/btrace.c:1589
        #39 0x0000561cb77f5a86 in btrace_enable (tp=0x561cbba11210,
conf=0x561cb8ac6878 <record_btrace_conf>) at
/home/smarchi/src/binutils-gdb/gdb/btrace.c:1629
        #40 0x0000561cb7d88d26 in record_btrace_enable_warn (tp=0x561cbba11210)
at /home/smarchi/src/binutils-gdb/gdb/record-btrace.c:294
        #41 0x0000561cb7c603dc in std::__invoke_impl<void, void
(*&)(thread_info*), thread_info*> (__f=@0x561cbb6c4878: 0x561cb7d88cdc
<record_btrace_enable_warn(thread_info*)>) at
/usr/include/c++/10/bits/invoke.h:60
        #42 0x0000561cb7c5e5a6 in std::__invoke_r<void, void
(*&)(thread_info*), thread_info*> (__fn=@0x561cbb6c4878: 0x561cb7d88cdc
<record_btrace_enable_warn(thread_info*)>) at
/usr/include/c++/10/bits/invoke.h:153
        #43 0x0000561cb7c5dc92 in std::_Function_handler<void (thread_info*),
void (*)(thread_info*)>::_M_invoke(std::_Any_data const&, thread_info*&&)
(__functor=..., __args#0=@0x7ffc4ee35310: 0x561cbba11210) at
/usr/include/c++/10/bits/std_function.h:291
        #44 0x0000561cb7f2600f in std::function<void
(thread_info*)>::operator()(thread_info*) const (this=0x561cbb6c4878,
__args#0=0x561cbba11210) at /usr/include/c++/10/bits/std_function.h:622
        #45 0x0000561cb7f23dc8 in
gdb::observers::observable<thread_info*>::notify (this=0x561cb8ac5aa0
<gdb::observers::new_thread>, args#0=0x561cbba11210) at
/home/smarchi/src/binutils-gdb/gdb/../gdbsupport/observable.h:150
        #46 0x0000561cb7f1c436 in add_thread_silent (targ=0x561cb8aafb60
<the_amd64_linux_nat_target>, ptid=...) at
/home/smarchi/src/binutils-gdb/gdb/thread.c:263
        #47 0x0000561cb7f1c479 in add_thread_with_info (targ=0x561cb8aafb60
<the_amd64_linux_nat_target>, ptid=..., priv=0x561cbb3f7ab0) at
/home/smarchi/src/binutils-gdb/gdb/thread.c:272
        #48 0x0000561cb7bfa1d0 in record_thread (info=0x561cbb0413a0, tp=0x0,
ptid=..., th_p=0x7ffc4ee35610, ti_p=0x7ffc4ee35620) at
/home/smarchi/src/binutils-gdb/gdb/linux-thread-db.c:1380
        #49 0x0000561cb7bf7a2a in thread_from_lwp (stopped=0x561cba81db20,
ptid=...) at /home/smarchi/src/binutils-gdb/gdb/linux-thread-db.c:429
        #50 0x0000561cb7bf7ac5 in thread_db_notice_clone (parent=...,
child=...) at /home/smarchi/src/binutils-gdb/gdb/linux-thread-db.c:447
        #51 0x0000561cb7bdc9a2 in linux_handle_extended_wait
(lp=0x561cbae25720, status=4991) at
/home/smarchi/src/binutils-gdb/gdb/linux-nat.c:1981
        #52 0x0000561cb7bdf0f3 in linux_nat_filter_event (lwpid=435403,
status=198015) at /home/smarchi/src/binutils-gdb/gdb/linux-nat.c:2920
        #53 0x0000561cb7bdfed6 in linux_nat_wait_1 (ptid=...,
ourstatus=0x7ffc4ee36398, target_options=...) at
/home/smarchi/src/binutils-gdb/gdb/linux-nat.c:3202
        #54 0x0000561cb7be0b68 in linux_nat_target::wait (this=0x561cb8aafb60
<the_amd64_linux_nat_target>, ptid=..., ourstatus=0x7ffc4ee36398,
target_options=...) at /home/smarchi/src/binutils-gdb/gdb/linux-nat.c:3440
        #55 0x0000561cb7bfa2fc in thread_db_target::wait (this=0x561cb8a9acd0
<the_thread_db_target>, ptid=..., ourstatus=0x7ffc4ee36398, options=...) at
/home/smarchi/src/binutils-gdb/gdb/linux-thread-db.c:1412
        #56 0x0000561cb7d8e356 in record_btrace_target::wait
(this=0x561cb8aa6250 <record_btrace_ops>, ptid=..., status=0x7ffc4ee36398,
options=...) at /home/smarchi/src/binutils-gdb/gdb/record-btrace.c:2547
        #57 0x0000561cb7ef996d in target_wait (ptid=..., status=0x7ffc4ee36398,
options=...) at /home/smarchi/src/binutils-gdb/gdb/target.c:2608
        #58 0x0000561cb7b6d297 in do_target_wait_1 (inf=0x561cba6d8780,
ptid=..., status=0x7ffc4ee36398, options=...) at
/home/smarchi/src/binutils-gdb/gdb/infrun.c:3640
        #59 0x0000561cb7b6d43e in operator() (__closure=0x7ffc4ee36190,
inf=0x561cba6d8780) at /home/smarchi/src/binutils-gdb/gdb/infrun.c:3701
        #60 0x0000561cb7b6d7b2 in do_target_wait (ecs=0x7ffc4ee36370,
options=...) at /home/smarchi/src/binutils-gdb/gdb/infrun.c:3720
        #61 0x0000561cb7b6e67d in fetch_inferior_event () at
/home/smarchi/src/binutils-gdb/gdb/infrun.c:4069
        #62 0x0000561cb7b4659b in inferior_event_handler
(event_type=INF_REG_EVENT) at /home/smarchi/src/binutils-gdb/gdb/inf-loop.c:41
        #63 0x0000561cb7be25f7 in handle_target_event (error=0,
client_data=0x0) at /home/smarchi/src/binutils-gdb/gdb/linux-nat.c:4227
        #64 0x0000561cb81e4ee2 in handle_file_event (file_ptr=0x561cbae24e10,
ready_mask=1) at /home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:575
        #65 0x0000561cb81e5490 in gdb_wait_for_event (block=0) at
/home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:701
        #66 0x0000561cb81e41be in gdb_do_one_event () at
/home/smarchi/src/binutils-gdb/gdbsupport/event-loop.cc:212
        #67 0x0000561cb7c18096 in start_event_loop () at
/home/smarchi/src/binutils-gdb/gdb/main.c:421
        #68 0x0000561cb7c181e0 in captured_command_loop () at
/home/smarchi/src/binutils-gdb/gdb/main.c:481
        #69 0x0000561cb7c19d7e in captured_main (data=0x7ffc4ee366a0) at
/home/smarchi/src/binutils-gdb/gdb/main.c:1353
        #70 0x0000561cb7c19df0 in gdb_main (args=0x7ffc4ee366a0) at
/home/smarchi/src/binutils-gdb/gdb/main.c:1368
        #71 0x0000561cb7693186 in main (argc=11, argv=0x7ffc4ee367b8) at
/home/smarchi/src/binutils-gdb/gdb/gdb.c:32

    At frame 45, the new_thread observable is fired.  At this moment, the
    new thread isn't the current thread, inferior_ptid is null_ptid.  I
    think this is ok: the new_thread observable doesn't give any guarantee
    on the global context when observers are invoked.  Frame 35,
    btrace_compute_ftrace_bts, calls gdb_insn_length.  gdb_insn_length
    doesn't have a thread_info or other parameter what could indicate where
    to read memory from, it implicitly uses the global context
    (inferior_ptid).

    So we reach the all_non_exited_threads_range in
    record_btrace_target::record_is_replaying with a null inferior_ptid.
    The previous implemention of all_non_exited_threads_range didn't care,
    but the new one does.  The problem of calling gdb_insn_length and
    ultimately trying to read memory with a null inferior_ptid already
    existed, but the commit mentioned above made it visible.

    Something between frames 40 (record_btrace_enable_warn) and 35
    (btrace_compute_ftrace_bts) needs to be switching the global context to
    make TP the current thread.  Since btrace_compute_ftrace_bts takes the
    thread_info to work with as a parameter, that typically means that it
    doesn't require its caller to also set the global current context
    (current thread) when calling.  If it needs to call other functions
    that do require the global current thread to be set, then it needs to
    temporarily change the current thread while calling these other
    functions.  Therefore, switch and restore the current thread in
    btrace_compute_ftrace_bts.

    By inspection, it looks like btrace_compute_ftrace_pt may also call
    functions sensitive to the global context: it installs the
    btrace_pt_readmem_callback callback in the PT instruction decoder.  When
    this function gets called, inferior_ptid must be set appropriately.  Add
    a switch and restore in there too.

    Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28086
    Change-Id: I407fbfe41aab990068bd102491aa3709b0a034b3

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

  parent reply	other threads:[~2021-07-19 13:45 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-14  7:12 [Bug record/28086] New: " vries at gcc dot gnu.org
2021-07-14  7:12 ` [Bug record/28086] " vries at gcc dot gnu.org
2021-07-14  7:14 ` vries at gcc dot gnu.org
2021-07-14  7:19 ` vries at gcc dot gnu.org
2021-07-14  9:33 ` vries at gcc dot gnu.org
2021-07-14 14:41 ` simark at simark dot ca
2021-07-14 15:13 ` vries at gcc dot gnu.org
2021-07-14 15:14 ` simark at simark dot ca
2021-07-14 15:30 ` simark at simark dot ca
2021-07-14 15:34 ` vries at gcc dot gnu.org
2021-07-19 13:45 ` cvs-commit at gcc dot gnu.org [this message]
2021-07-19 13:45 ` simark at simark dot ca
2021-10-12  9:41 ` vries at gcc dot gnu.org

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-28086-4717-ELnSmOoifS@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).