* Fix 16.0 handling. - Patches added: * gdb-testsuite-fix-gdb.python-py-format-string.exp-wi.patch * gdb-testsuite-fix-gdb.python-py-mi-cmd.exp-with-pyth.patch * gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-on-arm-lin.patch * gdb-testsuite-fix-regexp-in-gdb.ada-mi_var_access.ex.patch * gdb-testsuite-check-gnatmake-version-in-gdb.ada-scal.patch * gdb-testsuite-fix-gdb.arch-arm-pseudo-unwind.exp-wit.patch * gdb-symtab-fix-target-type-of-complex-long-double-on.patch * gdb-testsuite-don-t-use-set-auto-solib-add-off.patch * gdb-tdep-fix-arm-thumb2-hw-breakpoint.patch * gdb-testsuite-fix-gdb.cp-m-static.exp-on-arm.patch * gdb-testsuite-fix-gdb.dwarf2-dw2-fixed-point.exp-on-.patch * gdb-testsuite-fix-gdb.dwarf2-dw2-lines.exp-on-arm-li.patch * gdb-exp-fix-gdb.fortran-intrinsics.exp-fail-on-arm.patch * gdb-tdep-handle-sycall-statx-for-arm-linux.patch * gdb-tdep-fix-recording-of-t1-push.patch * gdb-tdep-handle-syscall-clock_gettime64-for-arm-linu.patch * fix-gdb.dwarf2-shortpiece.exp-on-s390x.patch * handle-address-class-annotation-for-s390x-in-some-te.patch * fix-gdb.dap-step-out.exp-on-s390x.patch * use-setvariable-in-gdb.dap-scopes.exp.patch * fix-gdb.base-finish-pretty.exp-on-s390x.patch * fix-gdb.base-readnever.exp-on-s390x.patch * add-dwarf_expr_piece.op.patch * add-gdbarch_dwarf2_reg_piece_offset-hook.patch * fix-gdb.base-store.exp-on-s390x.patch * fix-gdb.ada-o2_float_param.exp-on-s390x-linux.patch * gdb-testsuite-fix-gdb.base-branch-to-self.exp-on-arm.patch * gdb-tdep-fix-gdb.cp-non-trivial-retval.exp-on-riscv6.patch * gdb-testsuite-fix-gdb.cp-non-trivial-retval.exp-on-a.patch * gdb-testsuite-fix-gdb.rust-completion.exp-timeout-on.patch * gdb-testsuite-require-supports_process_record-in-gdb.patch * gdb-testsuite-fix-regexp-in-gdb.arch-i386-disp-step-.patch * gdb-testsuite-fix-gdb.arch-arm-single-step-kernel-he.patch * gdb-testsuite-fix-gdb.python-py-format-address.exp-o.patch * gdb-testsuite-fix-gdb.arch-riscv-tdesc-regs.exp.patch * gdb-testsuite-fix-gdb.base-list-dot-nodebug-and-make.patch * gdb-testsuite-fix-gdb.base-list-dot-nodebug.exp-on-o.patch * gdb-testsuite-fix-gdb.base-empty-host-env-vars.exp.patch * gdb-prune-inferior-after-switching-inferior.patch * gdb-testsuite-use-nostdlib-in-gdb.base-list-dot-node.patch * gdb-testsuite-fix-timeout-in-gdb.mi-mi-multi-command.patch * gdb-testsuite-require-can_spawn_for_attach-in-gdb.ba.patch * fixup-gdb-6.5-gcore-buffer-limit-test.patch * gdb-testsuite-fix-gdb.ada-big_packed_array.exp-on-s3.patch * gdb-testsuite-fix-gdb.ada-convvar_comp.exp-on-s390x-.patch * gdb-testsuite-fix-regexp-in-gdb.threads-stepi-over-c.patch OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=437
131 lines
4.8 KiB
Diff
131 lines
4.8 KiB
Diff
From 22d05b4879b8608e3768483735140a729952b565 Mon Sep 17 00:00:00 2001
|
|
From: Tom de Vries <tdevries@suse.de>
|
|
Date: Sun, 18 Aug 2024 20:51:29 +0200
|
|
Subject: [PATCH 39/46] [gdb] Prune inferior after switching inferior
|
|
|
|
Usually with test-case gdb.python/py-progspace-events.exp I get:
|
|
...
|
|
(gdb) inferior 1^M
|
|
[Switching to inferior 1 [process 4116] (py-progspace-events)]^M
|
|
[Switching to thread 1.1 (Thread 0xf77d0ce0 (LWP 4116))]^M
|
|
28 { /* Nothing. */ }^M
|
|
(gdb) PASS: gdb.python/py-progspace-events.exp: inferior 1
|
|
step^M
|
|
FreeProgspaceEvent: <gdb.Progspace object at 0xabf4f850>^M
|
|
do_parent_stuff () at py-progspace-events.c:41^M
|
|
41 ++global_var;^M
|
|
(gdb) PASS: gdb.python/py-progspace-events.exp: step
|
|
...
|
|
|
|
But occasionally I run into the following FAIL:
|
|
...
|
|
(gdb) inferior 1^M
|
|
[Switching to inferior 1 [process 5199] (py-progspace-events)]^M
|
|
[Switching to thread 1.1 (Thread 0xf77d0ce0 (LWP 5199))]^M
|
|
28 { /* Nothing. */ }^M
|
|
(gdb) FreeProgspaceEvent: <gdb.Progspace object at 0xabaf03a0>^M
|
|
FAIL: gdb.python/py-progspace-events.exp: inferior 1 (timeout)
|
|
...
|
|
|
|
This is caused by a race between the handling of an event, and the
|
|
"inferior 1" command.
|
|
|
|
In the passing case, the event is handled first. During which prune_inferiors
|
|
is called, but it can't remove inferior 2, because it's still the current one.
|
|
|
|
In the failing case, the "inferior 1" command is handled first. Then during
|
|
handling of the event, prune_inferiors is called, and it can remove inferior 2
|
|
because it's no longer the current one.
|
|
|
|
This looks like a test-case issue to me, but ISTM that we can do better: by
|
|
calling prune_inferiors asap, at the end of the "inferior 1" command, we
|
|
stabilize the moment when the inferior is removed:
|
|
...
|
|
(gdb) inferior 1^M
|
|
[Switching to inferior 1 [process 5199] (py-progspace-events)]^M
|
|
[Switching to thread 1.1 (Thread 0xf77d0ce0 (LWP 5199))]^M
|
|
28 { /* Nothing. */ }^M
|
|
FreeProgspaceEvent: <gdb.Progspace object at 0xabaf03a0>^M
|
|
(gdb) PASS: gdb.python/py-progspace-events.exp: inferior 1
|
|
...
|
|
|
|
This also allows us to simplify the test-case by removing the step command,
|
|
which is no longer required to trigger the pruning of the inferior.
|
|
|
|
Tested on x86_64-linux.
|
|
|
|
Approved-by: Kevin Buettner <kevinb@redhat.com>
|
|
|
|
PR gdb/31440
|
|
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31440
|
|
---
|
|
gdb/inferior.c | 4 +++
|
|
.../gdb.python/py-progspace-events.exp | 31 +++----------------
|
|
2 files changed, 9 insertions(+), 26 deletions(-)
|
|
|
|
diff --git a/gdb/inferior.c b/gdb/inferior.c
|
|
index 0522cb5c14d..2a19c5b19a1 100644
|
|
--- a/gdb/inferior.c
|
|
+++ b/gdb/inferior.c
|
|
@@ -790,6 +790,10 @@ inferior_command (const char *args, int from_tty)
|
|
notify_user_selected_context_changed
|
|
(USER_SELECTED_INFERIOR);
|
|
}
|
|
+
|
|
+ /* Switching current inferior may have made one of the inferiors
|
|
+ prunable, so prune it. */
|
|
+ prune_inferiors ();
|
|
}
|
|
}
|
|
|
|
diff --git a/gdb/testsuite/gdb.python/py-progspace-events.exp b/gdb/testsuite/gdb.python/py-progspace-events.exp
|
|
index 95e4ca8da0b..9dfc7573d40 100644
|
|
--- a/gdb/testsuite/gdb.python/py-progspace-events.exp
|
|
+++ b/gdb/testsuite/gdb.python/py-progspace-events.exp
|
|
@@ -79,37 +79,16 @@ gdb_test "continue" \
|
|
"\\\[Inferior $decimal \[^\r\n\]+ exited normally\\\]"] \
|
|
"continue until inferior 2 exits"
|
|
|
|
-gdb_test "inferior 1" "\\\[Switching to inferior 1 .*"
|
|
-
|
|
-# Step the inferior. During this process GDB will prune the now
|
|
+# Switch to inferior 1. During this process GDB will prune the now
|
|
# defunct inferior, which deletes its program space, which should
|
|
# trigger the FreeProgspaceEvent.
|
|
#
|
|
-# However, there is a slight problem. When the target is remote, and
|
|
-# GDB is accessing files using remote fileio, then GDB will attempt to
|
|
-# prune the inferior at a point in time when the remote target is
|
|
-# waiting for a stop reply. Pruning an inferior causes GDB to close
|
|
-# files associated with that inferior.
|
|
-#
|
|
-# In non-async mode we can't send fileio packets while waiting for a
|
|
-# stop reply, so the attempts to close files fails, and this shows up
|
|
-# as an error.
|
|
-#
|
|
-# As this error has nothing to do with the feature being tested here,
|
|
-# we just accept the error message, the important part is the
|
|
-# 'FreeProgspaceEvent' string, so long as that appears (just once)
|
|
-# then the test is a success.
|
|
-set warning_msg \
|
|
- [multi_line \
|
|
- "warning: cannot close \"\[^\r\n\]+\": Cannot execute this command while the target is running\\." \
|
|
- "Use the \"interrupt\" command to stop the target" \
|
|
- "and then try again\\."]
|
|
|
|
-gdb_test "step" \
|
|
+gdb_test "inferior 1" \
|
|
[multi_line \
|
|
- "^FreeProgspaceEvent.*: <gdb.Progspace object at $hex>(?:\r\n$warning_msg)*" \
|
|
- "do_parent_stuff \\(\\) at \[^\r\n\]+" \
|
|
- "$decimal\\s+\[^\r\n\]+"]
|
|
+ "\\\[Switching to inferior 1 .*" \
|
|
+ ".*" \
|
|
+ "FreeProgspaceEvent.*: <gdb.Progspace object at $hex>"]
|
|
|
|
# Let this inferior run to completion.
|
|
gdb_continue_to_end
|
|
--
|
|
2.43.0
|
|
|