This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] (Ada) crash connecting to TSIM simulator


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=54aa6c67f5a0d52dabd428cc40ce02781032acd3

commit 54aa6c67f5a0d52dabd428cc40ce02781032acd3
Author: Joel Brobecker <brobecker@adacore.com>
Date:   Tue Nov 21 14:04:38 2017 -0800

    (Ada) crash connecting to TSIM simulator
    
    Connecting to a TSIM simulator over the remote protocol causes GDB
    to crash with the following failed assertion:
    
        (gdb) tar remote :1234
        Remote debugging using :1234
        /[...]/gdb/ravenscar-thread.c:182: internal-error: ravenscar_update_inferior_ptid: Assertion `!is_ravenscar_task (inferior_ptid)' failed.
        A problem internal to GDB has been detected,
        further debugging may prove unreliable.
        Quit this debugging session? (y or n) y
    
    What happens is the following. Upon connection to the target, GDB
    sends a 'qfThreadInfo' query, which is the query asking the target
    for the ID of the first thread, and TSIM replies 'm0':
    
        Sending packet: $qfThreadInfo#bb...Ack
        Packet received: m0
    
    As a result of this, GDB takes the '0' as the TID, and because of it,
    constructs a ptid whose value is {42000, 0, 0}. This trips our
    !is_ravenscar_task check, because all it does to identify threads
    corresponding to ravenscar tasks is that their lwp is null, because
    that's how we construct their ptid.
    
    But this is unfortunatly not sufficient when debugging with TSIM,
    because the thread ID that TSIM returns causes the creation of
    a ptid whose lwp is zero, which matches the current identification
    scheme and yet is clearly not a ravenscar task.
    
    The fix is to also make sure that the ptid's tid field is nonzero.
    
    gdb/ChangeLog:
    
            * ravenscar-thread.c (is_ravenscar_task): Also verify that
            the ptid's TID is nonzero.

Diff:
---
 gdb/ChangeLog          |  5 +++++
 gdb/ravenscar-thread.c | 10 ++++++++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b833d34..eb4b03e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
 2017-11-21  Joel Brobecker  <brobecker@adacore.com>
 
+	* ravenscar-thread.c (is_ravenscar_task): Also verify that
+	the ptid's TID is nonzero.
+
+2017-11-21  Joel Brobecker  <brobecker@adacore.com>
+
 	* ada-lang.h (ada_get_tcb_types_info): Add declaration.
 	* ada-tasks.c (ada_get_tcb_types_info): Renames get_tcb_types_info.
 	Make non-static.  Change return type to char *.  Adjust code
diff --git a/gdb/ravenscar-thread.c b/gdb/ravenscar-thread.c
index e792227..00593b8 100644
--- a/gdb/ravenscar-thread.c
+++ b/gdb/ravenscar-thread.c
@@ -101,8 +101,14 @@ static void ravenscar_inferior_created (struct target_ops *target,
 static int
 is_ravenscar_task (ptid_t ptid)
 {
-  /* By construction, ravenscar tasks have their LWP set to zero.  */
-  return ptid_get_lwp (ptid) == 0;
+  /* By construction, ravenscar tasks have their LWP set to zero.
+     Also make sure that the TID is nonzero, as some remotes, when
+     asked for the list of threads, will return the first thread
+     as having its TID set to zero.  For instance, TSIM version
+     2.0.48 for LEON3 sends 'm0' as a reply to the 'qfThreadInfo'
+     query, which the remote protocol layer then treats as a thread
+     whose TID is 0.  This is obviously not a ravenscar task.  */
+  return ptid_get_lwp (ptid) == 0 && ptid_get_tid (ptid) != 0;
 }
 
 /* Given PTID, which can be either a ravenscar task or a CPU thread,


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]