From 0e8c3875ef4210c7bfa8548fe90033de89ea5f54 Mon Sep 17 00:00:00 2001 From: Arvid Ephraim Picciani <arvid.picciani@nokia.com> Date: Tue, 14 Sep 2010 12:57:24 +0200 Subject: [PATCH] Debugger: test gdb threeadlist capability Reviewed-by: hjk --- share/qtcreator/gdbmacros/dumper.py | 9 ++++++++- src/plugins/debugger/gdb/gdbengine.cpp | 5 ++++- src/plugins/debugger/gdb/gdbengine.h | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index 97f736b7b9c..ebc3b093463 100644 --- a/share/qtcreator/gdbmacros/dumper.py +++ b/share/qtcreator/gdbmacros/dumper.py @@ -89,6 +89,13 @@ def isGoodGdb(): # and gdb.VERSION != "6.8.50.20090630-cvs" return 'parse_and_eval' in __builtin__.dir(gdb) +def hasInferiorThreadList(): + try: + a= gdb.inferiors()[0].threads() + return True + except: + return False + typeCache = {} def lookupType(typestring): @@ -912,6 +919,7 @@ def bbsetup(): for key, value in qqFormats.items(): result += '{type="%s",formats="%s"},' % (key, value) result += '],namespace="%s"' % qqNs + result += ',hasInferiorThreadList="%s"' % int(hasInferiorThreadList()) return result @@ -1715,7 +1723,6 @@ class ThreadNamesCommand(gdb.Command): if e.name() == self.ns + "QThreadPrivate::start": thrptr = e.read_var("thr").dereference() d_ptr = thrptr["d_ptr"]["d"].cast(lookupType(self.ns + "QObjectPrivate").pointer()).dereference() - #warn("D_PTR: %s " % d_ptr) objectName = d_ptr["objectName"] i = 0 out += '{valueencoded="' + str(Hex4EncodedLittleEndianWithoutQuotes)+'",id="' diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 45a5761472b..fbd64176855 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1538,6 +1538,8 @@ void GdbEngine::handleHasPython(const GdbResponse &response) formats.append(reported.split(_(","), QString::SkipEmptyParts)); watchHandler()->addTypeFormats(type, formats); } + const GdbMi hasInferiorThreadList = data.findChild("hasInferiorThreadList"); + m_hasInferiorThreadList = (hasInferiorThreadList.data().toInt() != 0); } else { m_hasPython = false; if (m_gdbAdapter->dumperHandling() @@ -2963,7 +2965,8 @@ void GdbEngine::handleThreadInfo(const GdbResponse &response) response.data.findChild("current-thread-id").data().toInt(); threadsHandler()->setCurrentThreadId(currentThreadId); plugin()->updateState(this); // Adjust Threads combobox. - postCommand("threadnames " + theDebuggerAction(MaximalStackDepth)->value().toByteArray(), CB(handleThreadNames), id); + if (m_hasInferiorThreadList) + postCommand("threadnames " + theDebuggerAction(MaximalStackDepth)->value().toByteArray(), CB(handleThreadNames), id); } else { // Fall back for older versions: Try to get at least a list // of running threads. diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 25bf1e28f52..24ffdc63294 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -302,6 +302,7 @@ private: ////////// Gdb Output, State & Capability Handling ////////// int m_gdbBuildVersion; // MAC only? bool m_isMacGdb; bool m_hasPython; + bool m_hasInferiorThreadList; private: ////////// Inferior Management ////////// -- GitLab