CDB: Remove "experimental" message, better logging for threads

This commit is contained in:
Friedemann Kleint
2009-09-29 17:33:51 +02:00
parent 88a25204b3
commit cb8830d9af
4 changed files with 38 additions and 15 deletions

View File

@@ -19,7 +19,7 @@ CDB_PATH="$$(ProgramFiles)/Debugging Tools For Windows/sdk"
} }
exists ($$CDB_PATH) { exists ($$CDB_PATH) {
message("Experimental: Adding support for $$CDB_PATH") message("Adding support for $$CDB_PATH")
DEFINES+=CDB_ENABLED DEFINES+=CDB_ENABLED

View File

@@ -1201,8 +1201,8 @@ void CdbDebugEngine::activateFrame(int frameIndex)
QString errorMessage; QString errorMessage;
bool success = false; bool success = false;
do {
StackHandler *stackHandler = manager()->stackHandler(); StackHandler *stackHandler = manager()->stackHandler();
do {
WatchHandler *watchHandler = manager()->watchHandler(); WatchHandler *watchHandler = manager()->watchHandler();
const int oldIndex = stackHandler->currentIndex(); const int oldIndex = stackHandler->currentIndex();
if (frameIndex >= stackHandler->stackSize()) { if (frameIndex >= stackHandler->stackSize()) {
@@ -1230,10 +1230,15 @@ void CdbDebugEngine::activateFrame(int frameIndex)
if (CdbStackFrameContext *sgc = m_d->getStackFrameContext(frameIndex, &errorMessage)) if (CdbStackFrameContext *sgc = m_d->getStackFrameContext(frameIndex, &errorMessage))
success = sgc->populateModelInitially(watchHandler, &errorMessage); success = sgc->populateModelInitially(watchHandler, &errorMessage);
watchHandler->endCycle(); watchHandler->endCycle();
} else {
success = true;
} }
} while (false); } while (false);
if (!success) if (!success) {
warning(msgFunctionFailed(Q_FUNC_INFO, errorMessage)); 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; m_d->m_firstActivatedFrame = false;
} }
@@ -1536,6 +1541,28 @@ void CdbDebugEnginePrivate::setDebuggeeHandles(HANDLE hDebuggeeProcess, HANDLE
m_hDebuggeeThread = hDebuggeeThread; m_hDebuggeeThread = hDebuggeeThread;
} }
// Set thread in CDB engine
bool CdbDebugEnginePrivate::setCDBThreadId(unsigned long threadId, QString *errorMessage)
{
ULONG currentThreadId;
HRESULT hr = m_cif.debugSystemObjects->GetCurrentThreadId(&currentThreadId);
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() ULONG CdbDebugEnginePrivate::updateThreadList()
{ {
if (debugCDB) if (debugCDB)
@@ -1582,6 +1609,10 @@ void CdbDebugEnginePrivate::updateStackTrace()
clearForRun(); clearForRun();
QString errorMessage; QString errorMessage;
m_engine->reloadRegisters(); m_engine->reloadRegisters();
if (!setCDBThreadId(m_currentThreadId, &errorMessage)) {
m_engine->warning(errorMessage);
return;
}
m_currentStackTrace = m_currentStackTrace =
CdbStackTraceContext::create(m_dumper, m_currentThreadId, &errorMessage); CdbStackTraceContext::create(m_dumper, m_currentThreadId, &errorMessage);
if (!m_currentStackTrace) { if (!m_currentStackTrace) {

View File

@@ -116,6 +116,7 @@ struct CdbDebugEnginePrivate
bool isDebuggeeRunning() const { return m_watchTimer != -1; } bool isDebuggeeRunning() const { return m_watchTimer != -1; }
void handleDebugEvent(); void handleDebugEvent();
ULONG updateThreadList(); ULONG updateThreadList();
bool setCDBThreadId(unsigned long threadId, QString *errorMessage);
void updateStackTrace(); void updateStackTrace();
void updateModules(); void updateModules();

View File

@@ -53,19 +53,10 @@ CdbStackTraceContext *CdbStackTraceContext::create(const QSharedPointer<CdbDumpe
{ {
if (debugCDB) if (debugCDB)
qDebug() << Q_FUNC_INFO << threadId; 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 // fill the DEBUG_STACK_FRAME array
ULONG frameCount; ULONG frameCount;
CdbStackTraceContext *ctx = new CdbStackTraceContext(dumper); 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)) { if (FAILED(hr)) {
delete ctx; delete ctx;
*errorMessage = msgComFailed("GetStackTrace", hr); *errorMessage = msgComFailed("GetStackTrace", hr);