public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Lancelot SIX <lsix@lancelotsix.com>
To: Andrew Burgess <aburgess@redhat.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCHv2 7/7] gdb: some process_stratum_target should not be shared
Date: Wed, 5 Oct 2022 21:15:05 +0000	[thread overview]
Message-ID: <20221005211505.u2pj6qzkumpf4kle@ubuntu.lan> (raw)
In-Reply-To: <3ea56551906f0e7815950c3dc98747ce86b6e64d.1664729722.git.aburgess@redhat.com>

Hi,

Thanks for doing this!

I have a couple of comments below.

On Sun, Oct 02, 2022 at 06:04:48PM +0100, Andrew Burgess via Gdb-patches wrote:
> When multi-target support was added to GDB, an assumption was made
> that all process_stratum_target sub-classes could be shared by
> multiple inferiors.
> 
> For things like the Linux and FreeBSD native targets, as well as the
> remote target, this is absolutely true (or was made true).  But some
> targets were never updated to be shareable, for example, the
> core_target, which is used when reading core-files, stores some of its
> state in the program_space, but also, the core-file and the executable
> being debugged are closely related.
> 
> As each add-inferior call creates an inferior with a new
> program_space, and doesn't automatically copy the executable, or the
> current core-file, I don't think it really makes sense to "share"
> core_target objects between inferiors.
> 
> Consider this session:
> 
>   $ gdb -q
>   (gdb) file test1
>   Reading symbols from test1...
>   (gdb) core-file core.test1.433190
>   [New LWP 433190]
>   Core was generated by `./test1'.
>   Program terminated with signal SIGSEGV, Segmentation fault.
>   #0  0x0000000000401111 in foo () at test1.c:6
>   6	  return *global_ptr;
>   (gdb) add-inferior
>   [New inferior 2]
>   Added inferior 2 on connection 1 (core)
>   (gdb) info inferiors
>     Num  Description       Connection           Executable
>   * 1    process 433190    1 (core)             /tmp/multi-core/test1
>     2    <null>            1 (core)
>   (gdb) info connections
>     Num  What  Description
>   * 1    core  Local core dump file
>   (gdb) inferior 2
>   [Switching to inferior 2 [<null>] (<noexec>)]
>   (gdb) file test2
>   Reading symbols from test2...
>   (gdb) core-file core.test2.433203
>   [New LWP 433203]
>   Core was generated by `./test2'.
>   Program terminated with signal SIGSEGV, Segmentation fault.
>   #0  0x0000000000401111 in main () at test2.c:6
>   6	  return *global_ptr;
>   (gdb) info inferiors
>     Num  Description       Connection           Executable
>     1    process 433190    1 (core)             /tmp/multi-core/test1
>   * 2    process 433203    2 (core)             /tmp/multi-core/test2
>   (gdb) info connections
>     Num  What  Description
>     1    core  Local core dump file
>   * 2    core  Local core dump file
>   (gdb)
> 
> After the 'add-inferior' the core_target connection is shared between
> the inferiors.  However, as soon as the user sets up the core-file and
> executable in the new inferior a new core connection has been created.
> 
> I think this behaviour might be confusing, so I'd like to have GDB not
> initially share the core connection.  Instead, when the user tries to
> add the new inferior a warning is given, and the new inferior is
> created without a connection, like this:
> 
>   $ gdb -q
>   (gdb) file test1
>   Reading symbols from test1...
>   (gdb) core-file core.test1.433190
>   [New LWP 433190]
>   Core was generated by `./test1'.
>   Program terminated with signal SIGSEGV, Segmentation fault.
>   #0  0x0000000000401111 in foo () at test1.c:6
>   6	  return *global_ptr;
>   (gdb) add-inferior
>   [New inferior 2]
>   warning: can't share connection 1 (core) between inferiors
>   Added inferior 2
>   (gdb) info inferiors
>     Num  Description       Connection           Executable
>   * 1    process 433190    1 (core)             /tmp/multi-core/test1
>     2    <null>
>   (gdb)
> 
> If the user explicitly asks for the new inferior to be created without
> a connection, then no warning will be given.
> 
> At this point the user is free to setup inferior 2 with a different
> executable and core file (or to do anything they like with the
> inferior).
> 
> In an earlier version of this patch I had GDB error instead of giving
> a warning.  However, the error message ended up being something like:
> 
>   can't share connection ..... between inferiors, use -no-connection
>       option to create an inferior without sharing a connection.
> 
> but it seemed better to just create the inferior.
> 
> I've updated the docs, and added a NEWS entry for the new warning.  In
> the docs for clone-inferior I've added reference to -no-connection,
> which was previously missing.
> ---
>  gdb/NEWS                                     |   7 +
>  gdb/corelow.c                                |   5 +
>  gdb/doc/gdb.texinfo                          |  37 ++++-
>  gdb/inferior.c                               |  16 ++
>  gdb/inferior.h                               |   6 +-
>  gdb/target.c                                 |  14 ++
>  gdb/target.h                                 |   8 +
>  gdb/testsuite/gdb.multi/multi-core-files-1.c |  37 +++++
>  gdb/testsuite/gdb.multi/multi-core-files-2.c |  31 ++++
>  gdb/testsuite/gdb.multi/multi-core-files.exp | 156 +++++++++++++++++++
>  10 files changed, 313 insertions(+), 4 deletions(-)
>  create mode 100644 gdb/testsuite/gdb.multi/multi-core-files-1.c
>  create mode 100644 gdb/testsuite/gdb.multi/multi-core-files-2.c
>  create mode 100644 gdb/testsuite/gdb.multi/multi-core-files.exp
> 
> diff --git a/gdb/NEWS b/gdb/NEWS
> index a6ea7c9f98f..cb576edd203 100644
> --- a/gdb/NEWS
> +++ b/gdb/NEWS
> @@ -71,6 +71,13 @@
>    For both /r and /b GDB is now better at using whitespace in order to
>    align the disassembled instruction text.
>  
> +* The add-inferior, clone-inferior, and MI -add-inferior commands will
> +  now give a warning, and create the new inferior without a
> +  connection, when the current inferior, at the time the command is
> +  given, is a core-file target.  The core-file target could never
> +  really be shared between inferiors, GDB is now more vocal about what
> +  is going on.
> +
>  * New commands
>  
>  maintenance set ignore-prologue-end-flag on|off
> diff --git a/gdb/corelow.c b/gdb/corelow.c
> index 293bc8d4f59..4d8393a3587 100644
> --- a/gdb/corelow.c
> +++ b/gdb/corelow.c
> @@ -128,6 +128,11 @@ class core_target final : public process_stratum_target
>    /* See definition.  */
>    void info_proc_mappings (struct gdbarch *gdbarch);
>  
> +  /* The core_target only works for the inferior in which it was initially
> +     opened, and can't be copied to some other inferior's target_stack.  */
> +  bool is_shareable () override
> +  { return false; }
> +
>  private: /* per-core data */
>  
>    /* Get rid of the core inferior.  */
> diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
> index 107df84d108..a558fc4de38 100644
> --- a/gdb/doc/gdb.texinfo
> +++ b/gdb/doc/gdb.texinfo
> @@ -3358,8 +3358,31 @@
>  remote} command to connect to some other @code{gdbserver} instance,
>  use @code{run} to spawn a local program, etc.
>  
> +Not all connections can be shared between inferiors.  For example, the
> +@code{target core} target is unique for each inferior.  That is,
> +multiple inferiors can use @code{target core} at the same time, but
> +each @code{target core} is different.  If you try to
> +@code{add-inferior}, and the current inferior is @code{target core},
> +then @value{GDBN} will give a warning and create the new inferior
> +without a connection, like this:
> +
> +@smallexample
> +(@value{GDBP}) file test1
> +Reading symbols from test1...
> +(@value{GDBP}) target core core.test1.433190
> +[New LWP 433190]
> +Core was generated by `./test1'.
> +Program terminated with signal SIGSEGV, Segmentation fault.
> +#0  0x0000000000401111 in foo () at test1.c:6
> +6	  return *global_ptr;
> +(@value{GDBP}) add-inferior
> +[New inferior 2]
> +warning: can't share connection 1 (core) between inferiors
> +Added inferior 2
> +@end smallexample
> +
>  @kindex clone-inferior
> -@item clone-inferior [ -copies @var{n} ] [ @var{infno} ]
> +@item clone-inferior [ -copies @var{n} ] [ -no-connection ] [ @var{infno} ]
>  Adds @var{n} inferiors ready to execute the same program as inferior
>  @var{infno}; @var{n} defaults to 1, and @var{infno} defaults to the
>  number of the current inferior.  This command copies the values of the
> @@ -3384,6 +3407,13 @@
>  
>  You can now simply switch focus to inferior 2 and run it.
>  
> +Like @code{add-inferior}, @code{clone-inferior} shares the connection
> +with the inferior @var{infno}.  If the @var{-no-connection} option is
> +given then the new inferior will be created without a connection.  If
> +the connection of inferior @var{infno} can't be shared, then
> +@value{GDBN} will give a warning, and the new inferior will be created
> +without a connection.
> +
>  @kindex remove-inferiors
>  @item remove-inferiors @var{infno}@dots{}
>  Removes the inferior or inferiors @var{infno}@dots{}.  It is not
> @@ -37786,6 +37816,11 @@
>  @code{gdbserver} instance, use @code{-exec-run} to spawn a local
>  program, etc.
>  
> +If the connection of the current inferior cannot be shared, e.g.@: the
> +@code{-target-select core} target cannot be shared between inferiors,
> +then @value{GDBN} will give a warning and create the new inferior
> +without a connection.
> +
>  The command response always has a field, @var{inferior}, whose value
>  is the identifier of the thread group corresponding to the new
>  inferior.
> diff --git a/gdb/inferior.c b/gdb/inferior.c
> index a498b9d493c..0868a55593a 100644
> --- a/gdb/inferior.c
> +++ b/gdb/inferior.c
> @@ -817,6 +817,22 @@ switch_to_inferior_and_push_target (inferior *new_inf,
>       symbols.  */
>    switch_to_inferior_no_thread (new_inf);
>  
> +  if (!no_connection && proc_target != nullptr
> +      && !proc_target->is_shareable ())
> +    {
> +      if (proc_target->connection_string () != nullptr)
> +	warning (_("can't share connection %d (%s %s) between inferiors"),
> +		 proc_target->connection_number,
> +		 proc_target->shortname (),
> +		 proc_target->connection_string ());
> +      else
> +	warning (_("can't share connection %d (%s) between inferiors"),
> +		 proc_target->connection_number,
> +		 proc_target->shortname ());
> +
> +      proc_target = nullptr;
> +    }
> +
>    /* Reuse the target for new inferior.  */
>    if (!no_connection && proc_target != NULL)
>      {
> diff --git a/gdb/inferior.h b/gdb/inferior.h
> index 344974c4811..639364e5de3 100644
> --- a/gdb/inferior.h
> +++ b/gdb/inferior.h
> @@ -762,9 +762,9 @@ extern struct inferior *add_inferior_with_spaces (void);
>  /* Print the current selected inferior.  */
>  extern void print_selected_inferior (struct ui_out *uiout);
>  
> -/* Switch to inferior NEW_INF, a new inferior, and unless
> -   NO_CONNECTION is true, push the process_stratum_target of ORG_INF
> -   to NEW_INF.  */
> +/* Switch to inferior NEW_INF, a new inferior, and unless NO_CONNECTION is
> +   true, or the process_stratum_target of ORG_INF is not shareable, push
> +   the process_stratum_target of ORG_INF to NEW_INF.  */
>  
>  extern void switch_to_inferior_and_push_target
>    (inferior *new_inf, bool no_connection, inferior *org_inf);
> diff --git a/gdb/target.c b/gdb/target.c
> index 1e447f604d9..65bc0e7246e 100644
> --- a/gdb/target.c
> +++ b/gdb/target.c
> @@ -1188,6 +1188,12 @@ target_stack::push (target_ops *t)
>    if (m_stack[stratum].get () != nullptr)
>      unpush (m_stack[stratum].get ());
>  
> +  /* If this target can't be shared, then check that the target doesn't
> +     already appear on some other target stack.  */
> +  if (!t->is_shareable ())
> +    for (inferior *inf : all_inferiors ())
> +      gdb_assert (!inf->target_is_pushed (t));
> +
>    /* Now add the new one.  */
>    m_stack[stratum] = std::move (ref);
>  
> @@ -3226,6 +3232,14 @@ target_ops::fileio_readlink (struct inferior *inf, const char *filename,
>  
>  /* See target.h.  */
>  
> +bool
> +target_ops::is_shareable ()
> +{
> +  return true;
> +}
> +
> +/* See target.h.  */
> +
>  int
>  target_fileio_open (struct inferior *inf, const char *filename,
>  		    int flags, int mode, bool warn_if_slow, fileio_error *target_errno)
> diff --git a/gdb/target.h b/gdb/target.h
> index 547ee8a3bbd..30e5085a543 100644
> --- a/gdb/target.h
> +++ b/gdb/target.h
> @@ -1321,6 +1321,14 @@ struct target_ops
>      virtual bool store_memtags (CORE_ADDR address, size_t len,
>  				const gdb::byte_vector &tags, int type)
>        TARGET_DEFAULT_NORETURN (tcomplain ());
> +
> +    /* Return true if this target can be shared on multiple target_stacks,
> +       or false if this target should only appear on a single target_stack.
> +       When this function returns false multiple separate instances of the
> +       same target_ops sub-class can still appear on different
> +       target_stacks, but the same concrete instance can only appear on a
> +       single target_stack.  */
> +    virtual bool is_shareable ();
>    };
>  
>  /* Deleter for std::unique_ptr.  See comments in
> diff --git a/gdb/testsuite/gdb.multi/multi-core-files-1.c b/gdb/testsuite/gdb.multi/multi-core-files-1.c
> new file mode 100644
> index 00000000000..f996973023e
> --- /dev/null
> +++ b/gdb/testsuite/gdb.multi/multi-core-files-1.c
> @@ -0,0 +1,37 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2022 Free Software Foundation, Inc.
> +
> +   This program is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 3 of the License, or
> +   (at your option) any later version.
> +
> +   This program is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> +
> +#include <stdlib.h>
> +
> +int
> +bar ()
> +{
> +  abort ();
> +  return 0;
> +}
> +
> +int
> +baz ()
> +{
> +  return bar ();
> +}
> +
> +int
> +main ()
> +{
> +  return baz ();
> +}
> diff --git a/gdb/testsuite/gdb.multi/multi-core-files-2.c b/gdb/testsuite/gdb.multi/multi-core-files-2.c
> new file mode 100644
> index 00000000000..fb99e137c3f
> --- /dev/null
> +++ b/gdb/testsuite/gdb.multi/multi-core-files-2.c
> @@ -0,0 +1,31 @@
> +/* This testcase is part of GDB, the GNU debugger.
> +
> +   Copyright 2022 Free Software Foundation, Inc.
> +
> +   This program is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 3 of the License, or
> +   (at your option) any later version.
> +
> +   This program is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> +
> +#include <stdlib.h>
> +
> +int
> +foo ()
> +{
> +  abort ();
> +  return 0;
> +}
> +
> +int
> +main ()
> +{
> +  return foo ();
> +}
> diff --git a/gdb/testsuite/gdb.multi/multi-core-files.exp b/gdb/testsuite/gdb.multi/multi-core-files.exp
> new file mode 100644
> index 00000000000..9cf188b0caa
> --- /dev/null
> +++ b/gdb/testsuite/gdb.multi/multi-core-files.exp
> @@ -0,0 +1,156 @@
> +# Copyright 2022 Free Software Foundation, Inc.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 3 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +
> +# This script runs some basic tests that GDB can support multiple
> +# inferiors each debugging different core files.
> +#
> +# We also check the behaviour of GDB if the user attempts to clone or
> +# duplicate an inferior that is debugging a core file.
> +
> +standard_testfile -1.c -2.c
> +
> +set binfile1 "${binfile}-1"
> +set binfile2 "${binfile}-2"
> +
> +if {[build_executable "build first executable" $binfile1 $srcfile \
> +	 debug] == -1} {
> +    untested "failed to compile first executable"
> +    return -1
> +}
> +
> +if {[build_executable "build first executable" $binfile2 $srcfile2 \

s/first/second/ maybe?

> +	 debug] == -1} {
> +    untested "failed to compile second executable"
> +    return -1
> +}
> +
> +set corefile1 [core_find $binfile1]
> +set corefile2 [core_find $binfile2]

I think you should check corefile*.

On my system (where ulimit -c gives 0), I have:

    WARNING: can't generate a core file - core tests suppressed - check ulimit -c
    WARNING: can't generate a core file - core tests suppressed - check ulimit -c
    FAIL: gdb.multi/multi-core-files.exp: load core file
    FAIL: gdb.multi/multi-core-files.exp: check backtrace in inferior 1
    FAIL: gdb.multi/multi-core-files.exp: add-inferior
    FAIL: gdb.multi/multi-core-files.exp: clone-inferior
    FAIL: gdb.multi/multi-core-files.exp: interpreter-exec mi "-add-inferior"
    FAIL: gdb.multi/multi-core-files.exp: first info inferiors call
    FAIL: gdb.multi/multi-core-files.exp: second info inferiors call
    FAIL: gdb.multi/multi-core-files.exp: info connections
    FAIL: gdb.multi/multi-core-files.exp: Loaded second core file
    FAIL: gdb.multi/multi-core-files.exp: check backtrace in inferior 2
    FAIL: gdb.multi/multi-core-files.exp: Loaded first core file into inferior 3
    FAIL: gdb.multi/multi-core-files.exp: check backtrace in inferior 3
    FAIL: gdb.multi/multi-core-files.exp: detach from inferior 3 core file (the program is no longer running)
    FAIL: gdb.multi/multi-core-files.exp: detach from inferior 2 core file (the program is no longer running)
    FAIL: gdb.multi/multi-core-files.exp: check backtrace in inferior 1 again
    FAIL: gdb.multi/multi-core-files.exp: detach from inferior 1 core file (the program is no longer running)

I think something like this could do:

    if { $corefile1 eq "" || $corefile2 eq "" } {
      untested "Can't generate core files"
      return
    }

> +
> +# Start GDB, and load the first executable and corefile into the first
> +# inferior.
> +clean_restart ${binfile1}
> +gdb_test "core-file $corefile1" "Program terminated with .*" \
> +    "load core file"
> +gdb_test "bt" "bar \\(\\) at .*" \
> +    "check backtrace in inferior 1"
> +
> +# Try to use add-inferior and clone-inferior to create new
> +# inferiors. In both cases this will try to share the core_target
               ^
Should be 2 spaces after the "."?

> +# between inferior 1 and the new inferior.  As the core_target can't
> +# be shared we should get a warning, and the inferior should be
> +# created without a connection.
> +gdb_test "add-inferior" \
> +    [multi_line \
> +	 "\\\[New inferior 2\\\]" \
> +	 "warning: can't share connection 1 \\(core\\) between inferiors" \
> +	 "Added inferior 2"]
> +gdb_test "clone-inferior" \
> +    [multi_line \
> +	 "\\\[New inferior 3\\\]" \
> +	 "warning: can't share connection 1 \\(core\\) between inferiors" \
> +	 "Added inferior 3"]
> +
> +# Check the MI -add-inferior command.  Do this using interpreter-exec.
> +# We're not doing a full MI test here, just checking this one command.
> +gdb_test "interpreter-exec mi \"-add-inferior\"" \
> +    [multi_line \
> +	 "~\"\\\[New inferior 4\\\]..\"" \
> +	 "&\"warning: can't share connection 1 \\(core\\) between inferiors..\"" \
> +	 "~\"Added inferior 4..\"" \
> +	 "\\^done,inferior=\"\[^\"\]+\""]
> +
> +# Now check that non of the new inferiors have a connection.

s/non/none/

> +gdb_test "info inferiors" \
> +    [multi_line \
> +	 "\\*\\s+1\\s+\[^\r\n\]+\\s+1 \\(core\\)\\s+\[^\r\n\]+.*" \
> +	 "\\s+2\\s+<null>\\s+" \
> +	 "\\s+3\\s+<null>\\s+\[^\r\n\]+" \
> +	 "\\s+4\\s+<null>\\s+"] \
> +    "first info inferiors call"
> +
> +# Now use add-inferior and clone-inferior but this time with the
> +# -no-connection option, this should avoid issuing the warning.  We
> +# also use interpreter-exec to test the MI version of this command.
> +gdb_test "add-inferior -no-connection" \
> +    [multi_line \
> +	 "\\\[New inferior 5\\\]" \
> +	 "Added inferior 5"]
> +gdb_test "clone-inferior -no-connection" \
> +    [multi_line \
> +	 "\\\[New inferior 6\\\]" \
> +	 "Added inferior 6"]
> +gdb_test "interpreter-exec mi \"-add-inferior --no-connection\"" \
> +    "\\\[New inferior 7\\\].*Added inferior 7.*"
> +
> +# Now check that non of the new inferiors have a connection.

s/non/none/

Best,
Lancelot.

> +gdb_test "info inferiors" \
> +    [multi_line \
> +	 "\\*\\s+1\\s+\[^\r\n\]+\\s+1 \\(core\\)\\s+\[^\r\n\]+.*" \
> +	 "\\s+2\\s+<null>\\s+" \
> +	 "\\s+3\\s+<null>\\s+\[^\r\n\]+" \
> +	 "\\s+4\\s+<null>\\s+" \
> +	 "\\s+5\\s+<null>\\s+" \
> +	 "\\s+6\\s+<null>\\s+\[^\r\n\]+" \
> +	 "\\s+7\\s+<null>\\s+"] \
> +    "second info inferiors call"
> +
> +# Check after all the new inferiors have been created that we still
> +# only have a single connection.
> +gdb_test "info connections" \
> +    "\\*\\s+1\\s+\\s+core\\s+Local core dump file\\s*"
> +
> +# Now switch to inferior 2 and load the second executable and core
> +# file.  Check the backtrace for the presence of function 'foo', this
> +# indicates we are seeing the correct core file.
> +gdb_test "inferior 2" "Switching to inferior 2 .*"
> +gdb_test "file $binfile2" \
> +    "Reading symbols from .*" \
> +    "Loaded second test binary"
> +gdb_test "core-file $corefile2" \
> +    "Program terminated with signal SIGABRT, Aborted.*" \
> +    "Loaded second core file"
> +gdb_test "bt" "foo \\(\\) at .*" \
> +    "check backtrace in inferior 2"
> +
> +# Switch to inferior 3, this one was cloned from inferior 1, so is
> +# already debugging the first binary file.  Check its backtrace for
> +# 'bar', which indicates we are debugging the correct core file.
> +gdb_test "inferior 3" "Switching to inferior 3 .*"
> +gdb_test "core-file $corefile1" \
> +    "Program terminated with signal SIGABRT, Aborted.*" \
> +    "Loaded first core file into inferior 3"
> +gdb_test "bt" "bar \\(\\) at .*" \
> +    "check backtrace in inferior 3"
> +
> +# Detach from some of the core files and delete some of the inferiors.
> +gdb_test "detach" "No core file now\\." \
> +    "detach from inferior 3 core file"
> +gdb_test "inferior 2" "Switching to inferior 2 .*" \
> +    "switch back to inferior 2"
> +gdb_test_no_output "remove-inferiors 3 4"
> +
> +# Now detach in inferior 2, and delete the inferior.
> +gdb_test "detach" "No core file now\\." \
> +    "detach from inferior 2 core file"
> +gdb_test "inferior 1" "Switching to inferior 1 .*" \
> +    "switch back to inferior 1"
> +gdb_test_no_output "remove-inferiors 2"
> +
> +# Finally, check that inferior 1 backtrace is still working.
> +gdb_test "bt" "bar \\(\\) at .*" \
> +    "check backtrace in inferior 1 again"
> +gdb_test "detach" "No core file now\\." \
> +    "detach from inferior 1 core file"
> -- 
> 2.25.4
> 

  parent reply	other threads:[~2022-10-05 21:15 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-21 13:12 [PATCH] gdb: fix target_ops reference count for some cases Andrew Burgess
2022-09-21 15:30 ` Simon Marchi
2022-09-22 14:21   ` Andrew Burgess
2022-09-22 14:52     ` Simon Marchi
2022-09-22 15:00 ` Simon Marchi
2022-09-22 17:24   ` Andrew Burgess
2022-09-26 14:16     ` Simon Marchi
2022-10-01 20:58       ` Andrew Burgess
2022-10-02 17:04 ` [PATCHv2 0/7] " Andrew Burgess
2022-10-02 17:04   ` [PATCHv2 1/7] gdb/remote: remove some manual reference count handling Andrew Burgess
2022-10-02 17:04   ` [PATCHv2 2/7] gdb: remove decref_target Andrew Burgess
2022-10-02 17:04   ` [PATCHv2 3/7] gdb: have target_stack automate reference count handling Andrew Burgess
2022-10-02 17:04   ` [PATCHv2 4/7] gdb: remove the pop_all_targets (and friends) global functions Andrew Burgess
2022-10-05 20:49     ` Lancelot SIX
2022-10-06 11:14       ` Andrew Burgess
2022-10-02 17:04   ` [PATCHv2 5/7] gdb: ensure all targets are popped before an inferior is destructed Andrew Burgess
2022-10-02 17:04   ` [PATCHv2 6/7] gdb/maint: add core file name to 'maint info program-spaces' output Andrew Burgess
2022-10-02 17:21     ` Eli Zaretskii
2022-10-02 17:04   ` [PATCHv2 7/7] gdb: some process_stratum_target should not be shared Andrew Burgess
2022-10-02 17:21     ` Eli Zaretskii
2022-10-05 21:15     ` Lancelot SIX [this message]
2022-10-06 11:44       ` Andrew Burgess
2022-11-18 16:42   ` [PATCHv3 0/7] gdb: fix target_ops reference count for some cases Andrew Burgess
2022-11-18 16:42     ` [PATCHv3 1/7] gdb/remote: remove some manual reference count handling Andrew Burgess
2022-11-18 16:42     ` [PATCHv3 2/7] gdb: remove decref_target Andrew Burgess
2022-11-18 17:22       ` Tom Tromey
2022-11-18 16:42     ` [PATCHv3 3/7] gdb: have target_stack automate reference count handling Andrew Burgess
2022-11-18 17:25       ` Tom Tromey
2022-11-18 16:42     ` [PATCHv3 4/7] gdb: remove the pop_all_targets (and friends) global functions Andrew Burgess
2022-11-18 17:29       ` Tom Tromey
2022-11-18 16:42     ` [PATCHv3 5/7] gdb: ensure all targets are popped before an inferior is destructed Andrew Burgess
2022-11-18 16:42     ` [PATCHv3 6/7] gdb/maint: add core file name to 'maint info program-spaces' output Andrew Burgess
2022-11-18 17:03       ` Eli Zaretskii
2022-11-18 16:42     ` [PATCHv3 7/7] gdb: some process_stratum_target should not be shared Andrew Burgess
2022-11-18 17:02       ` Eli Zaretskii
2022-11-18 18:04       ` Tom Tromey
2022-12-14 13:57         ` Andrew Burgess

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=20221005211505.u2pj6qzkumpf4kle@ubuntu.lan \
    --to=lsix@lancelotsix.com \
    --cc=aburgess@redhat.com \
    --cc=gdb-patches@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).