diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py index 97f736b7b9c9218444c484234fa2ccae64b45dac..ebc3b09346351289b71dd93b54464252566943ad 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 45a5761472b097dcc74897d99b0d5af1674875ec..fbd64176855963739262012bb98afc95adf33bce 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 25bf1e28f522566c6b2e0212e91d9468c91b75d8..24ffdc632944ec81e7065c74a9940a848d388927 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 //////////