[PATCH v2 1/6] gdb, btrace: fix pr19340
Markus Metzger
markus.t.metzger@intel.com
Thu Apr 11 05:25:59 GMT 2024
GDB fails with an assertion when stopping recording on a replaying thread
and then resuming that thread. Stopping recording left the thread
replaying but the record target is gone.
Stop replaying all threads in the selected inferior before stopping recording.
If the selected thread had been replaying, print the (potentially updated)
location.
I had to change the stepping test slightly to account for different
compilers generating slightly different debug information, so when
stepping the 'return 0' after 'record stop' I would end up in a different
location depending on which compiler I used. The test still covers all
stepping commands.
Fixes PR gdb/19340.
---
gdb/record-btrace.c | 17 +++++++++++++++++
gdb/testsuite/gdb.btrace/step.exp | 22 +++++++++++++++-------
2 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 0ef1dfbe652..1d946f9d3f2 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -414,11 +414,28 @@ record_btrace_target::stop_recording ()
{
DEBUG ("stop recording");
+ /* Remember the selected thread if it exists and is replaying. */
+ thread_info *curr = nullptr;
+ if (inferior_ptid.lwp_p ())
+ {
+ curr = inferior_thread ();
+ if (!btrace_is_replaying (curr))
+ curr = nullptr;
+ }
+
+ record_stop_replaying ();
record_btrace_auto_disable ();
for (thread_info *tp : current_inferior ()->non_exited_threads ())
if (tp->btrace.target != NULL)
btrace_disable (tp);
+
+ /* Print the updated location in case we had stopped a replaying thread. */
+ if (curr != nullptr)
+ {
+ curr->set_stop_pc (regcache_read_pc (get_thread_regcache (curr)));
+ print_stack_frame (get_selected_frame (), 1, SRC_AND_LOC, 1);
+ }
}
/* The disconnect method of target record-btrace. */
diff --git a/gdb/testsuite/gdb.btrace/step.exp b/gdb/testsuite/gdb.btrace/step.exp
index 0adc18bd924..ed6d2140bdd 100644
--- a/gdb/testsuite/gdb.btrace/step.exp
+++ b/gdb/testsuite/gdb.btrace/step.exp
@@ -31,18 +31,26 @@ if ![runto_main] {
# trace the call to the test function
with_test_prefix "record" {
gdb_test_no_output "record btrace"
- gdb_test "next"
+ gdb_test "step"
+ gdb_test "next 2"
}
# let's step around a bit
with_test_prefix "replay" {
- gdb_test "reverse-next" ".*main\.2.*" "reverse-next.1"
+ gdb_test "reverse-finish" ".*main\.2.*" "reverse-finish.1"
gdb_test "step" ".*fun4\.2.*" "step.1"
gdb_test "next" ".*fun4\.3.*" "next.1"
gdb_test "step" ".*fun2\.2.*" "step.2"
- gdb_test "finish" ".*fun4\.4.*" "finish.1"
- gdb_test "reverse-step" ".*fun2\.3.*" "reverse-step.1"
- gdb_test "reverse-finish" ".*fun4\.3.*" "reverse-finish.1"
- gdb_test "reverse-next" ".*fun4\.2.*" "reverse-next.2"
- gdb_test "reverse-finish" ".*main\.2.*" "reverse-finish.2"
+ gdb_test "reverse-finish" ".*fun4\.3.*" "reverse-finish.2"
+ gdb_test "reverse-step" ".*fun1\.2.*" "reverse-step.1"
+ gdb_test "finish" ".*fun4\.3.*" "finish.1"
+ gdb_test "reverse-next" ".*fun4\.2.*" "reverse-next.1"
+ gdb_test "reverse-finish" ".*main\.2.*" "reverse-finish.3"
+}
+
+# stop recording and try to step live (pr19340)
+with_test_prefix "live" {
+ gdb_test "record stop" "fun4\.4.*Process record is stopped.*"
+ gdb_test "reverse-next" "Target .* does not support this command.*"
+ gdb_test "step" ".*fun3\.2.*"
}
--
2.34.1
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
More information about the Gdb-patches
mailing list