From: timurgol007 Date: Wed, 10 Sep 2025 12:13:55 +0000 (+0300) Subject: gdb: fix record si error in baremetal gdb X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=832008ae39ad47f11f078675f8960e05a208a316;p=thirdparty%2Fbinutils-gdb.git gdb: fix record si error in baremetal gdb While I was debugging application using spike, openocd and baremetal gdb in record mode I encountered with gdb internal error. The reason was that minus_one_ptid had been passed to record_full_target::resume method. And in this function, the assert worked in target_thread_architecture. So I added a check before calling this function, that ptid is not minus_one_ptid. Actually, minus_one_ptid here doesn't mean that an error has occured, but it is just a define for RESUME_ALL. (gdb) record (gdb) si ../../gdb/process-stratum-target.c:32: internal-error: thread_architecture: Assertion `inf != NULL' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. ----- Backtrace ----- ... 0x71463a _ZN22process_stratum_target19thread_architectureE6ptid_t ../../gdb/process-stratum-target.c:32 0x71463a _ZN22process_stratum_target19thread_architectureE6ptid_t ../../gdb/process-stratum-target.c:29 0x77131f _ZN18record_full_target6resumeE6ptid_ti10gdb_signal ../../gdb/record-full.c:1087 0x85a761 _Z13target_resume6ptid_ti10gdb_signal ../../gdb/target.c:2654 0x677aa9 do_target_resume ../../gdb/infrun.c:2631 0x6818b5 resume_1 ../../gdb/infrun.c:2984 0x6828a8 resume ../../gdb/infrun.c:2997 0x682b13 keep_going_pass_signal ../../gdb/infrun.c:9144 0x682fd9 proceed_resume_thread_checked ../../gdb/infrun.c:3580 ... --------------------- --- diff --git a/gdb/record-full.c b/gdb/record-full.c index 2fbdf3b9f42..e2298b3e23e 100644 --- a/gdb/record-full.c +++ b/gdb/record-full.c @@ -1084,9 +1084,10 @@ record_full_target::resume (ptid_t ptid, int step, enum gdb_signal signal) if (!RECORD_FULL_IS_REPLAY) { - struct gdbarch *gdbarch = target_thread_architecture (ptid); + struct regcache *regcache = get_thread_regcache (inferior_thread ()); + struct gdbarch *gdbarch = regcache->arch (); - record_full_message (get_thread_regcache (inferior_thread ()), signal); + record_full_message (regcache, signal); if (!step) {