From 88bc157b7cdb551a9dbe548d66bc65f2eafe8f3d Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Fri, 17 Sep 2010 13:28:50 +0200
Subject: [PATCH] Debugger[CDB]: Add thread names.

---
 src/plugins/debugger/breakpoint.cpp             |  6 +++---
 src/plugins/debugger/cdb/cdbcom.h               |  1 +
 .../debugger/cdb/cdbstacktracecontext.cpp       |  1 +
 src/plugins/debugger/cdb/coreengine.cpp         | 11 ++++++++++-
 src/plugins/debugger/cdb/coreengine.h           |  1 +
 src/plugins/debugger/cdb/stacktracecontext.cpp  | 17 ++++++++++++++---
 src/plugins/debugger/cdb/stacktracecontext.h    |  1 +
 src/plugins/debugger/threadshandler.cpp         |  3 +++
 8 files changed, 34 insertions(+), 7 deletions(-)

diff --git a/src/plugins/debugger/breakpoint.cpp b/src/plugins/debugger/breakpoint.cpp
index 314ca87681b..cef7f4ada9e 100644
--- a/src/plugins/debugger/breakpoint.cpp
+++ b/src/plugins/debugger/breakpoint.cpp
@@ -43,7 +43,7 @@
 #include <QtCore/QDebug>
 #include <QtCore/QTextStream>
 #include <QtCore/QFileInfo>
-
+#include <QtCore/QDir>
 
 //////////////////////////////////////////////////////////////////
 //
@@ -239,7 +239,7 @@ QString BreakpointData::toToolTip() const
     QTextStream str(&rc);
     str << "<html><body><table>"
         << "<tr><td>" << BreakHandler::tr("Marker File:")
-        << "</td><td>" << m_markerFileName << "</td></tr>"
+        << "</td><td>" << QDir::toNativeSeparators(m_markerFileName) << "</td></tr>"
         << "<tr><td>" << BreakHandler::tr("Marker Line:")
         << "</td><td>" << m_markerLineNumber << "</td></tr>"
         << "<tr><td>" << BreakHandler::tr("Breakpoint Number:")
@@ -257,7 +257,7 @@ QString BreakpointData::toToolTip() const
         << "<tr><td>" << BreakHandler::tr("Internal Number:")
         << "</td><td>&mdash;</td><td>" << bpNumber << "</td></tr>"
         << "<tr><td>" << BreakHandler::tr("File Name:")
-        << "</td><td>" << fileName << "</td><td>" << bpFileName << "</td></tr>"
+        << "</td><td>" << fileName << "</td><td>" << QDir::toNativeSeparators(bpFileName) << "</td></tr>"
         << "<tr><td>" << BreakHandler::tr("Function Name:")
         << "</td><td>" << funcName << "</td><td>" << bpFuncName << "</td></tr>"
         << "<tr><td>" << BreakHandler::tr("Line Number:")
diff --git a/src/plugins/debugger/cdb/cdbcom.h b/src/plugins/debugger/cdb/cdbcom.h
index d11bcf10a34..7c20e47c398 100644
--- a/src/plugins/debugger/cdb/cdbcom.h
+++ b/src/plugins/debugger/cdb/cdbcom.h
@@ -47,6 +47,7 @@ typedef IDebugDataSpaces4      CIDebugDataSpaces;
 
 typedef IDebugSymbolGroup2     CIDebugSymbolGroup;
 typedef IDebugBreakpoint2      CIDebugBreakpoint;
+typedef IDebugAdvanced2        CIDebugAdvanced;
 
 #else
 
diff --git a/src/plugins/debugger/cdb/cdbstacktracecontext.cpp b/src/plugins/debugger/cdb/cdbstacktracecontext.cpp
index 8395b04b58d..e0e5d3fa9fb 100644
--- a/src/plugins/debugger/cdb/cdbstacktracecontext.cpp
+++ b/src/plugins/debugger/cdb/cdbstacktracecontext.cpp
@@ -141,6 +141,7 @@ bool CdbStackTraceContext::getThreads(const CdbCore::ComInterfaces &cif,
         const CdbCore::Thread &coreThread = coreThreads.at(i);
         ThreadData data(coreThread.id);
         data.targetId = QLatin1String("0x") + QString::number(coreThread.systemId);
+        data.name = coreThread.name;
         if (stopped) {
             const CdbCore::StackFrame &coreFrame = frames.at(i);
             data.address = coreFrame.address;
diff --git a/src/plugins/debugger/cdb/coreengine.cpp b/src/plugins/debugger/cdb/coreengine.cpp
index c84b7b92642..f1c7fae1f40 100644
--- a/src/plugins/debugger/cdb/coreengine.cpp
+++ b/src/plugins/debugger/cdb/coreengine.cpp
@@ -152,7 +152,8 @@ ComInterfaces::ComInterfaces() :
     debugSystemObjects(0),
     debugSymbols(0),
     debugRegisters(0),
-    debugDataSpaces(0)
+    debugDataSpaces(0),
+    debugAdvanced(0)
 {
 }
 
@@ -250,6 +251,8 @@ CoreEngine::~CoreEngine()
         m_cif.debugRegisters->Release();
     if (m_cif.debugDataSpaces)
         m_cif.debugDataSpaces->Release();
+    if (m_cif.debugAdvanced)
+        m_cif.debugAdvanced->Release();
 }
 
 bool CoreEngine::init(const QString &dllEnginePath, QString *errorMessage)
@@ -310,6 +313,12 @@ bool CoreEngine::init(const QString &dllEnginePath, QString *errorMessage)
         return false;
     }
 
+    hr = lib.debugCreate( __uuidof(IDebugAdvanced2), reinterpret_cast<void**>(&m_cif.debugAdvanced));
+    if (FAILED(hr)) {
+        *errorMessage = QString::fromLatin1("Creation of IDebugAdvanced2 failed: %1").arg(msgDebugEngineComResult(hr));
+        return false;
+    }
+
     if (debug)
         qDebug() << QString::fromLatin1("CDB Initialization succeeded, interrupt time out %1s.").arg(getInterruptTimeOutSecs(m_cif.debugControl));
     return true;
diff --git a/src/plugins/debugger/cdb/coreengine.h b/src/plugins/debugger/cdb/coreengine.h
index c6e25e9cede..e3300d048d8 100644
--- a/src/plugins/debugger/cdb/coreengine.h
+++ b/src/plugins/debugger/cdb/coreengine.h
@@ -52,6 +52,7 @@ struct ComInterfaces
     CIDebugSymbols*         debugSymbols;
     CIDebugRegisters*       debugRegisters;
     CIDebugDataSpaces*      debugDataSpaces;
+    CIDebugAdvanced*        debugAdvanced;
 };
 
 class CoreEngine : public QObject
diff --git a/src/plugins/debugger/cdb/stacktracecontext.cpp b/src/plugins/debugger/cdb/stacktracecontext.cpp
index 5e520ef14a0..352b2045847 100644
--- a/src/plugins/debugger/cdb/stacktracecontext.cpp
+++ b/src/plugins/debugger/cdb/stacktracecontext.cpp
@@ -84,7 +84,8 @@ QString Thread::toString() const
 {
     QString rc;
     QTextStream str(&rc);
-    str << "Thread id " << id << " System id " << systemId << " Data at 0x";
+    str << "Thread id " << id << " System id " << systemId
+        << " name='" << name <<"' Data at 0x";
     str.setIntegerBase(16);
     str << dataOffset;
     return rc;
@@ -401,13 +402,23 @@ bool StackTraceContext::getThreadList(const CdbCore::ComInterfaces &cif,
         return false;
     }
     // Create entries
+    static WCHAR name[256];
     for (ULONG i= 0; i < threadCount ; i++) {
-        threads->push_back(Thread(ids[i], systemIds[i]));
+        const ULONG id = ids[i];
+        Thread thread(id, systemIds[i]);
         if (ids[i] ==  *currentThreadId) { // More info for current
             ULONG64 offset;
             if (SUCCEEDED(cif.debugSystemObjects->GetCurrentThreadDataOffset(&offset)))
-                threads->back().dataOffset = offset;
+                thread.dataOffset = offset;
         }
+        // Name
+        ULONG bytesReceived = 0;
+        hr = cif.debugAdvanced->GetSystemObjectInformation(DEBUG_SYSOBJINFO_THREAD_NAME_WIDE,
+                                                           0, id, name,
+                                                           sizeof(name), &bytesReceived);
+        if (SUCCEEDED(hr) && bytesReceived)
+            thread.name = QString::fromWCharArray(name);
+        threads->push_back(thread);
     }
     return true;
 }
diff --git a/src/plugins/debugger/cdb/stacktracecontext.h b/src/plugins/debugger/cdb/stacktracecontext.h
index 750f40b2d68..3881003ee4f 100644
--- a/src/plugins/debugger/cdb/stacktracecontext.h
+++ b/src/plugins/debugger/cdb/stacktracecontext.h
@@ -70,6 +70,7 @@ struct Thread {
     unsigned long id;
     unsigned long systemId;
     quint64 dataOffset; // Only for current.
+    QString name;
 };
 
 inline bool operator<(const Thread &t1, const Thread &t2) { return t1.id < t2.id; }
diff --git a/src/plugins/debugger/threadshandler.cpp b/src/plugins/debugger/threadshandler.cpp
index f8a07920b9b..9309dea3229 100644
--- a/src/plugins/debugger/threadshandler.cpp
+++ b/src/plugins/debugger/threadshandler.cpp
@@ -73,6 +73,9 @@ static inline QString threadToolTip(const ThreadData &thread)
     if (!thread.targetId.isEmpty())
         str << tableRowStartC << ThreadsHandler::tr("Target&nbsp;id:")
         << tableRowSeparatorC << thread.targetId << tableRowEndC;
+    if (!thread.name.isEmpty())
+        str << tableRowStartC << ThreadsHandler::tr("Name:")
+        << tableRowSeparatorC << thread.name << tableRowEndC;
     if (!thread.state.isEmpty())
         str << tableRowStartC << ThreadsHandler::tr("State:")
         << tableRowSeparatorC << thread.state << tableRowEndC;
-- 
GitLab