]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: fix record si error in baremetal gdb
authortimurgol007 <timurgol007@gmail.com>
Wed, 10 Sep 2025 12:13:55 +0000 (15:13 +0300)
committertimurgol007 <timurgol007@gmail.com>
Tue, 16 Sep 2025 16:44:26 +0000 (19:44 +0300)
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
...
---------------------

gdb/record-full.c

index 2fbdf3b9f42ec6f590413d75470c212564352795..e2298b3e23e52332ff370aee62749646dd641d09 100644 (file)
@@ -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)
        {