diff --git a/src/plugins/debugger/cdb/cdb.pri b/src/plugins/debugger/cdb/cdb.pri index 06f14409d32ce59bcba0db88d1452f7910d80d8e..16c33776496e35330a872f3ddf85083ede78cbec 100644 --- a/src/plugins/debugger/cdb/cdb.pri +++ b/src/plugins/debugger/cdb/cdb.pri @@ -19,7 +19,7 @@ CDB_PATH="$$(ProgramFiles)/Debugging Tools For Windows/sdk" } exists ($$CDB_PATH) { -message("Experimental: Adding support for $$CDB_PATH") +message("Adding support for $$CDB_PATH") DEFINES+=CDB_ENABLED diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp index 8c2b5f47187cfc6400dfe8b8affdc777b693781b..73b773edae0d8b04263b83e86517607c3ab5ecbf 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine.cpp +++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp @@ -1201,8 +1201,8 @@ void CdbDebugEngine::activateFrame(int frameIndex) QString errorMessage; bool success = false; - do { - StackHandler *stackHandler = manager()->stackHandler(); + StackHandler *stackHandler = manager()->stackHandler(); + do { WatchHandler *watchHandler = manager()->watchHandler(); const int oldIndex = stackHandler->currentIndex(); if (frameIndex >= stackHandler->stackSize()) { @@ -1230,10 +1230,15 @@ void CdbDebugEngine::activateFrame(int frameIndex) if (CdbStackFrameContext *sgc = m_d->getStackFrameContext(frameIndex, &errorMessage)) success = sgc->populateModelInitially(watchHandler, &errorMessage); watchHandler->endCycle(); + } else { + success = true; } } while (false); - if (!success) - warning(msgFunctionFailed(Q_FUNC_INFO, errorMessage)); + if (!success) { + const QString msg = QString::fromLatin1("Internal error: activateFrame() failed for frame #1 of %2, thread %3: %4"). + arg(frameIndex).arg(stackHandler->stackSize()).arg(m_d->m_currentThreadId).arg(errorMessage); + warning(msg); + } m_d->m_firstActivatedFrame = false; } @@ -1536,6 +1541,28 @@ void CdbDebugEnginePrivate::setDebuggeeHandles(HANDLE hDebuggeeProcess, HANDLE m_hDebuggeeThread = hDebuggeeThread; } +// Set thread in CDB engine +bool CdbDebugEnginePrivate::setCDBThreadId(unsigned long threadId, QString *errorMessage) +{ + ULONG currentThreadId; + HRESULT hr = m_cif.debugSystemObjects->GetCurrentThreadId(¤tThreadId); + if (FAILED(hr)) { + *errorMessage = msgComFailed("GetCurrentThreadId", hr); + return false; + } + if (currentThreadId == threadId) + return true; + hr = m_cif.debugSystemObjects->SetCurrentThreadId(threadId); + if (FAILED(hr)) { + *errorMessage = QString::fromLatin1("Failed to change to from thread %1 to %2: SetCurrentThreadId() failed: %3"). + arg(currentThreadId).arg(threadId).arg(msgDebugEngineComResult(hr)); + return false; + } + const QString msg = CdbDebugEngine::tr("Changing threads: %1 -> %2").arg(currentThreadId).arg(threadId); + m_engine->showStatusMessage(msg, 500); + return true; +} + ULONG CdbDebugEnginePrivate::updateThreadList() { if (debugCDB) @@ -1582,6 +1609,10 @@ void CdbDebugEnginePrivate::updateStackTrace() clearForRun(); QString errorMessage; m_engine->reloadRegisters(); + if (!setCDBThreadId(m_currentThreadId, &errorMessage)) { + m_engine->warning(errorMessage); + return; + } m_currentStackTrace = CdbStackTraceContext::create(m_dumper, m_currentThreadId, &errorMessage); if (!m_currentStackTrace) { diff --git a/src/plugins/debugger/cdb/cdbdebugengine_p.h b/src/plugins/debugger/cdb/cdbdebugengine_p.h index 55c1d9717bc8095213e648d8e0895b8c2336305e..7e813599d9a6df7f9ad065af002271075a206432 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine_p.h +++ b/src/plugins/debugger/cdb/cdbdebugengine_p.h @@ -116,6 +116,7 @@ struct CdbDebugEnginePrivate bool isDebuggeeRunning() const { return m_watchTimer != -1; } void handleDebugEvent(); ULONG updateThreadList(); + bool setCDBThreadId(unsigned long threadId, QString *errorMessage); void updateStackTrace(); void updateModules(); diff --git a/src/plugins/debugger/cdb/cdbstacktracecontext.cpp b/src/plugins/debugger/cdb/cdbstacktracecontext.cpp index cf669a5cfff064443b902a5f2ea34d5c0a229c69..6cdaf627092fe82ebe211e2abe84a9a41ba1dff2 100644 --- a/src/plugins/debugger/cdb/cdbstacktracecontext.cpp +++ b/src/plugins/debugger/cdb/cdbstacktracecontext.cpp @@ -53,19 +53,10 @@ CdbStackTraceContext *CdbStackTraceContext::create(const QSharedPointer<CdbDumpe { if (debugCDB) qDebug() << Q_FUNC_INFO << threadId; - CdbComInterfaces *cif = dumper->comInterfaces(); - HRESULT hr = cif->debugSystemObjects->SetCurrentThreadId(threadId); - if (FAILED(hr)) { - *errorMessage = QString::fromLatin1("%1: SetCurrentThreadId %2 failed: %3"). - arg(QString::fromLatin1(Q_FUNC_INFO)). - arg(threadId). - arg(msgDebugEngineComResult(hr)); - return 0; - } // fill the DEBUG_STACK_FRAME array ULONG frameCount; CdbStackTraceContext *ctx = new CdbStackTraceContext(dumper); - hr = cif->debugControl->GetStackTrace(0, 0, 0, ctx->m_cdbFrames, CdbStackTraceContext::maxFrames, &frameCount); + const HRESULT hr = dumper->comInterfaces()->debugControl->GetStackTrace(0, 0, 0, ctx->m_cdbFrames, CdbStackTraceContext::maxFrames, &frameCount); if (FAILED(hr)) { delete ctx; *errorMessage = msgComFailed("GetStackTrace", hr);