public inbox for gdb-prs@sourceware.org
help / color / mirror / Atom feed
* [Bug python/27841] New: Failed assertion: assigning convenience variable during inferior exit Python event
@ 2021-05-10 17:43 simark at simark dot ca
  2021-05-10 17:43 ` [Bug python/27841] " simark at simark dot ca
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: simark at simark dot ca @ 2021-05-10 17:43 UTC (permalink / raw)
  To: gdb-prs

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

            Bug ID: 27841
           Summary: Failed assertion: assigning convenience variable
                    during inferior exit Python event
           Product: gdb
           Version: HEAD
            Status: NEW
          Severity: normal
          Priority: P2
         Component: python
          Assignee: unassigned at sourceware dot org
          Reporter: simark at simark dot ca
  Target Milestone: ---

See: https://sourceware.org/pipermail/gdb-patches/2021-May/178716.html

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug python/27841] Failed assertion: assigning convenience variable during inferior exit Python event
  2021-05-10 17:43 [Bug python/27841] New: Failed assertion: assigning convenience variable during inferior exit Python event simark at simark dot ca
@ 2021-05-10 17:43 ` simark at simark dot ca
  2021-06-03 21:00 ` cvs-commit at gcc dot gnu.org
  2021-06-03 21:15 ` simark at simark dot ca
  2 siblings, 0 replies; 4+ messages in thread
From: simark at simark dot ca @ 2021-05-10 17:43 UTC (permalink / raw)
  To: gdb-prs

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

Simon Marchi <simark at simark dot ca> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |11.1

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug python/27841] Failed assertion: assigning convenience variable during inferior exit Python event
  2021-05-10 17:43 [Bug python/27841] New: Failed assertion: assigning convenience variable during inferior exit Python event simark at simark dot ca
  2021-05-10 17:43 ` [Bug python/27841] " simark at simark dot ca
@ 2021-06-03 21:00 ` cvs-commit at gcc dot gnu.org
  2021-06-03 21:15 ` simark at simark dot ca
  2 siblings, 0 replies; 4+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2021-06-03 21:00 UTC (permalink / raw)
  To: gdb-prs

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

--- Comment #1 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Magne Hov <mhov@sourceware.org>:

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

commit df5bc734f2dcd07ed3261cd679743924e8962439
Author: Magne Hov <mhov@undo.io>
Date:   Thu Jun 3 21:20:30 2021 +0100

    gdb: fix eval.c assert during inferior exit event

    Evaluating expressions from within an inferior exit event handler can
    cause a crash:

        echo "int main() { return 0; }" > repro.c
        gcc -g repro.c -o repro
        ./gdb -q --ex "set language c++" --ex "python
gdb.events.exited.connect(lambda _: gdb.execute('set \$_a=0'))" --ex "run"
repro

        Reading symbols from repro...
        Starting program:
/home/mhov/repos/binutils-gdb-master/install-bad/bin/repro
        [Inferior 1 (process 1974779) exited normally]
        ../../gdb/thread.c:72: internal-error: thread_info* inferior_thread():
Assertion `current_thread_ != nullptr' failed.
        A problem internal to GDB has been detected,
        further debugging may prove unreliable.
        Quit this debugging session? (y or n) [answered Y; input not from
terminal]

        This is a bug, please report it.  For instructions, see:
        <https://www.gnu.org/software/gdb/bugs/>.

    Backtrace
        0  in internal_error of ../../gdbsupport/errors.cc:51
        1  in inferior_thread of ../../gdb/thread.c:72
        2  in expression::evaluate of ../../gdb/eval.c:98
        3  in evaluate_expression of ../../gdb/eval.c:115
        4  in set_command of ../../gdb/printcmd.c:1502
        5  in do_const_cfunc of ../../gdb/cli/cli-decode.c:101
        6  in cmd_func of ../../gdb/cli/cli-decode.c:2181
        7  in execute_command of ../../gdb/top.c:670
        ...
        22 in python_inferior_exit of ../../gdb/python/py-inferior.c:182

    In `expression::evaluate (...)' there is a call to `inferior_thread
    ()' that is guarded by `target_has_execution ()':

        struct value *
        expression::evaluate (struct type *expect_type, enum noside noside)
        {
          gdb::optional<enable_thread_stack_temporaries> stack_temporaries;
          if (target_has_execution ()
              && language_defn->la_language == language_cplus
              && !thread_stack_temporaries_enabled_p (inferior_thread ()))
            stack_temporaries.emplace (inferior_thread ());

    The `target_has_execution ()' guard maps onto `inf->pid' and the
    `inferior_thread ()' call assumes that `current_thread_' is set to
    something meaningful:

        struct thread_info*
        inferior_thread (void)
        {
          gdb_assert (current_thread_ != nullptr);
          return current_thread_;
        }

    In other words, it is assumed that if `inf->pid' is set then
    `current_thread_' must also be set. This does not hold at the point
    where inferior exit observers are notified:
    - `generic_mourn_inferior (...)'
      - `switch_to_no_thread ()'
        - `current_thread_ = nullptr;'
      - `exit_inferior (...)'
        - `gdb::observers::inferior_exit.notify (...)'
        - `inf->pid = 0'

    The inferior exit notification means that a Python handler can get a
    chance to run while `current_thread' has been cleared and the
    `inf->pid' has not been cleared. Since the Python handler can call any
    GDB command with `gdb.execute(...)' (in my case `gdb.execute("set
    $_a=0")' we can end up evaluating expressions and asserting in
    `evaluate_subexp (...)'.

    This patch adds a test in `evaluate_subexp (...)' to check the global
    `inferior_ptid' which is reset at the same time as `current_thread_'.
    Checking `inferior_ptid' at the same time as `target_has_execution ()'
    seems to be a common pattern:

        $ git grep -n -e inferior_ptid --and -e target_has_execution
        gdb/breakpoint.c:2998:    && (inferior_ptid == null_ptid ||
!target_has_execution ()))
        gdb/breakpoint.c:3054:    && (inferior_ptid == null_ptid ||
!target_has_execution ()))
        gdb/breakpoint.c:4587:  if (inferior_ptid == null_ptid ||
!target_has_execution ())
        gdb/infcmd.c:360:  if (inferior_ptid != null_ptid &&
target_has_execution ())
        gdb/infcmd.c:2380:  /* FIXME:  This should not really be inferior_ptid
(or target_has_execution).
        gdb/infrun.c:3438:  if (!target_has_execution () || inferior_ptid ==
null_ptid)
        gdb/remote.c:11961:  if (!target_has_execution () || inferior_ptid ==
null_ptid)
        gdb/solib.c:725:  if (target_has_execution () && inferior_ptid !=
null_ptid)

    The testsuite has been run on 5.4.0-59-generic x86_64 GNU/Linux:
    - Ubuntu 20.04.1 LTS
    - gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
    - DejaGnu version 1.6.2
      - Expect version 5.45.4
      - Tcl version 8.6
    - Native configuration: x86_64-pc-linux-gnu
    - Target: unix

    Results show a few XFAIL in
    gdb.threads/attach-many-short-lived-threads.exp. The existing
    py-events.exp tests are skipped for native-gdbserver and fail for
    native-extended-gdbserver, but the new tests pass with
    native-extended-gdbserver when run without the existing tests.

    gdb/ChangeLog:

    2021-06-03  Magne Hov  <mhov@undo.io>

            PR python/27841
            * eval.c (expression::evaluate): Check inferior_ptid.

    gdb/testsuite/ChangeLog:

    2021-06-03  Magne Hov  <mhov@undo.io>

            PR python/27841
            * gdb.python/py-events.exp: Extend inferior exit tests.
            * gdb.python/py-events.py: Print inferior exit PID.

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug python/27841] Failed assertion: assigning convenience variable during inferior exit Python event
  2021-05-10 17:43 [Bug python/27841] New: Failed assertion: assigning convenience variable during inferior exit Python event simark at simark dot ca
  2021-05-10 17:43 ` [Bug python/27841] " simark at simark dot ca
  2021-06-03 21:00 ` cvs-commit at gcc dot gnu.org
@ 2021-06-03 21:15 ` simark at simark dot ca
  2 siblings, 0 replies; 4+ messages in thread
From: simark at simark dot ca @ 2021-06-03 21:15 UTC (permalink / raw)
  To: gdb-prs

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

Simon Marchi <simark at simark dot ca> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |FIXED
             Status|NEW                         |RESOLVED

--- Comment #2 from Simon Marchi <simark at simark dot ca> ---
Fixed by commit above.

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-06-03 21:15 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-10 17:43 [Bug python/27841] New: Failed assertion: assigning convenience variable during inferior exit Python event simark at simark dot ca
2021-05-10 17:43 ` [Bug python/27841] " simark at simark dot ca
2021-06-03 21:00 ` cvs-commit at gcc dot gnu.org
2021-06-03 21:15 ` simark at simark dot ca

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).