From f240ceb4e6f395079c153c6352b508f1a961bec9 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Mon, 19 Oct 2009 10:59:46 +0200 Subject: [PATCH] CDB: Fix code model scope detection when stopping at function scope. that is, setting a break point at the opening brace or at function. Set StackFrame::from correctly. --- .../debugger/cdb/cdbstacktracecontext.cpp | 5 ++++ src/plugins/debugger/watchutils.cpp | 26 ++++++++++--------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbstacktracecontext.cpp b/src/plugins/debugger/cdb/cdbstacktracecontext.cpp index 7a1448d708f..90329dfe04f 100644 --- a/src/plugins/debugger/cdb/cdbstacktracecontext.cpp +++ b/src/plugins/debugger/cdb/cdbstacktracecontext.cpp @@ -88,6 +88,7 @@ bool CdbStackTraceContext::init(unsigned long frameCount, QString * /*errorMessa if (debugCDB) qDebug() << Q_FUNC_INFO << frameCount; + const QChar exclamationMark = QLatin1Char('!'); m_frameContexts.resize(frameCount); qFill(m_frameContexts, static_cast<CdbStackFrameContext*>(0)); @@ -102,7 +103,11 @@ bool CdbStackTraceContext::init(unsigned long frameCount, QString * /*errorMessa frame.address = QString::fromLatin1("0x%1").arg(instructionOffset, 0, 16); m_cif->debugSymbols->GetNameByOffsetWide(instructionOffset, wszBuf, MAX_PATH, 0, 0); + // Determine function and module, if available frame.function = QString::fromUtf16(reinterpret_cast<const ushort *>(wszBuf)); + const int moduleSepPos = frame.function.indexOf(exclamationMark); + if (moduleSepPos != -1) + frame.from = frame.function.mid(0, moduleSepPos); ULONG ulLine; ULONG64 ul64Displacement; diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp index e7d52147aa9..55e03207bdb 100644 --- a/src/plugins/debugger/watchutils.cpp +++ b/src/plugins/debugger/watchutils.cpp @@ -365,16 +365,24 @@ int getUninitializedVariablesI(const CPlusPlus::Snapshot &snapshot, const CPlusPlus::Symbol *symbolAtLine = doc->findSymbolAt(line, 0); if (!symbolAtLine) return 4; - // First figure out the function to do a safety name check. + // First figure out the function to do a safety name check + // and the innermost scope at cursor position const CPlusPlus::Function *function = 0; - const bool hitFunction = symbolAtLine->isFunction(); - if (hitFunction) { + const CPlusPlus::Scope *innerMostScope = 0; + if (symbolAtLine->isFunction()) { function = symbolAtLine->asFunction(); + if (function->memberCount() == 1) // Skip over function block + if (CPlusPlus::Block *block = function->memberAt(0)->asBlock()) + innerMostScope = block->members(); } else { - if (CPlusPlus::Scope *functionScope = symbolAtLine->enclosingFunctionScope()) + if (const CPlusPlus::Scope *functionScope = symbolAtLine->enclosingFunctionScope()) { function = functionScope->owner()->asFunction(); + innerMostScope = symbolAtLine->isBlock() ? + symbolAtLine->asBlock()->members() : + symbolAtLine->enclosingBlockScope(); + } } - if (!function) + if (!function || !innerMostScope) return 7; // Compare function names with a bit off fuzz, // skipping modules from a CDB symbol "lib!foo" or namespaces @@ -388,13 +396,7 @@ int getUninitializedVariablesI(const CPlusPlus::Snapshot &snapshot, if (previousChar != ':' && previousChar != '!' ) return 11; } - // Starting from the innermost block scope, collect - // declarations. - const CPlusPlus::Scope *innerMostScope = hitFunction ? - symbolAtLine->asFunction()->members() : - symbolAtLine->enclosingBlockScope(); - if (!innerMostScope) - return 15; + // Starting from the innermost block scope, collect declarations. SeenHash seenHash; blockRecursion(overview, innerMostScope, line, uninitializedVariables, &seenHash); return 0; -- GitLab