Commit 1db44c05 authored by dt's avatar dt
Browse files

Merge branch '1.3' of git@scm.dev.nokia.troll.no:creator/mainline into 1.3

parents ceaa92ec b9cd3378
......@@ -1618,9 +1618,11 @@ static void qDumpQList(QDumper &d)
const QListData &ldata = *reinterpret_cast<const QListData*>(d.data);
const QListData::Data *pdata =
*reinterpret_cast<const QListData::Data* const*>(d.data);
int nn = ldata.size();
const int nn = ldata.size();
if (nn < 0)
return;
const bool innerTypeIsPointer = isPointerType(d.innerType);
const int n = qMin(nn, 1000);
if (nn > 0) {
if (ldata.d->begin < 0)
return;
......@@ -1631,18 +1633,19 @@ static void qDumpQList(QDumper &d)
return;
#endif
qCheckAccess(ldata.d->array);
//qCheckAccess(ldata.d->array[0]);
//qCheckAccess(ldata.d->array[nn - 1]);
// Additional checks on pointer arrays
if (innerTypeIsPointer)
for (int i = 0; i != n; ++i)
if (const void *p = ldata.d->array + i + pdata->begin)
qCheckAccess(deref(p));
}
qCheckAccess(pdata);
int n = nn;
d.putItemCount("value", n);
d.putItem("valueeditable", "false");
d.putItem("numchild", n);
if (d.dumpChildren) {
unsigned innerSize = d.extraInt[0];
bool innerTypeIsPointer = isPointerType(d.innerType);
const unsigned innerSize = d.extraInt[0];
QByteArray strippedInnerType = stripPointerType(d.innerType);
// The exact condition here is:
......@@ -1653,8 +1656,6 @@ static void qDumpQList(QDumper &d)
bool isInternal = innerSize <= int(sizeof(void*))
&& isMovableType(d.innerType);
d.putItem("internal", (int)isInternal);
if (n > 1000)
n = 1000;
d.beginChildren(n ? d.innerType : 0);
for (int i = 0; i != n; ++i) {
d.beginHash();
......@@ -2917,23 +2918,21 @@ static void qDumpQVector(QDumper &d)
int nn = v->size;
if (nn < 0)
return;
if (nn > 0) {
//qCheckAccess(&vec.front());
//qCheckAccess(&vec.back());
}
const bool innerIsPointerType = isPointerType(d.innerType);
const unsigned innersize = d.extraInt[0];
const int n = qMin(nn, 1000);
// Check pointers
if (innerIsPointerType && nn > 0)
for (int i = 0; i != n; ++i)
if (const void *p = addOffset(v, i * innersize + typeddatasize))
qCheckAccess(deref(p));
int n = nn;
d.putItemCount("value", n);
d.putItem("valueeditable", "false");
d.putItem("numchild", n);
if (d.dumpChildren) {
QByteArray strippedInnerType = stripPointerType(d.innerType);
const char *stripped =
isPointerType(d.innerType) ? strippedInnerType.data() : 0;
if (n > 1000)
n = 1000;
const char *stripped = innerIsPointerType ? strippedInnerType.data() : 0;
d.beginChildren(d.innerType);
for (int i = 0; i != n; ++i) {
d.beginHash();
......
......@@ -166,12 +166,32 @@ protected:
return false;
}
bool checkScope(Symbol *symbol, Symbol *otherSymbol) const
{
if (! (symbol && otherSymbol))
return false;
else if (symbol->scope() == otherSymbol->scope())
return true;
else if (symbol->name() && otherSymbol->name()) {
if (! symbol->name()->isEqualTo(otherSymbol->name()))
return false;
} else if (symbol->name() != otherSymbol->name()) {
return false;
}
return checkScope(symbol->enclosingSymbol(), otherSymbol->enclosingSymbol());
}
bool isDeclSymbol(Symbol *symbol) const
{
if (! symbol)
if (! symbol) {
return false;
else if (symbol == _declSymbol) {
} else if (symbol == _declSymbol) {
return true;
} else if (symbol->line() == _declSymbol->line() && symbol->column() == _declSymbol->column()) {
......@@ -180,11 +200,11 @@ protected:
} else if (symbol->isForwardClassDeclaration() && (_declSymbol->isClass() ||
_declSymbol->isForwardClassDeclaration())) {
return true;
return checkScope(symbol, _declSymbol);
} else if (_declSymbol->isForwardClassDeclaration() && (symbol->isClass() ||
symbol->isForwardClassDeclaration())) {
return true;
return checkScope(symbol, _declSymbol);
}
return false;
......@@ -349,6 +369,20 @@ protected:
return false;
}
virtual bool visit(EnumeratorAST *ast)
{
Identifier *id = identifier(ast->identifier_token);
if (id == _id) {
LookupContext context = currentContext(ast);
const QList<Symbol *> candidates = context.resolve(control()->nameId(id));
reportResult(ast->identifier_token, candidates);
}
accept(ast->expression);
return false;
}
virtual bool visit(SimpleNameAST *ast)
{
Identifier *id = identifier(ast->identifier_token);
......
......@@ -727,7 +727,7 @@ QByteArray CppModelManager::internalDefinedMacros() const
return macros;
}
void CppModelManager::setIncludesInPaths(const QMap<QString, QStringList> includesInPaths)
void CppModelManager::setIncludesInPaths(const QMap<QString, QStringList> &includesInPaths)
{
QMutexLocker locker(&mutex);
QMapIterator<QString, QStringList> i(includesInPaths);
......@@ -1182,7 +1182,7 @@ void CppModelManager::updateIncludesInPaths(QFutureInterface<void> &future,
future.waitForResume();
if (future.isCanceled())
break;
return;
const QString path = paths.takeFirst();
......
......@@ -163,7 +163,7 @@ private:
QStringList internalFrameworkPaths() const;
QByteArray internalDefinedMacros() const;
void setIncludesInPaths(const QMap<QString, QStringList> includesInPaths);
void setIncludesInPaths(const QMap<QString, QStringList> &includesInPaths);
static void updateIncludesInPaths(QFutureInterface<void> &future,
CppModelManager *manager,
......
......@@ -37,6 +37,7 @@
#include "cdbassembler.h"
#include "cdboptionspage.h"
#include "cdboptions.h"
#include "cdbexceptionutils.h"
#include "debuggeragents.h"
#include "debuggeractions.h"
......@@ -305,12 +306,14 @@ CdbDebugEnginePrivate::CdbDebugEnginePrivate(DebuggerManager *manager,
m_dumper(new CdbDumperHelper(manager, &m_cif)),
m_currentThreadId(-1),
m_eventThreadId(-1),
m_interrupted(false),
m_interruptArticifialThreadId(-1),
m_interrupted(false),
m_watchTimer(-1),
m_debugEventCallBack(engine),
m_engine(engine),
m_currentStackTrace(0),
m_firstActivatedFrame(true),
m_inferiorStartupComplete(false),
m_mode(AttachCore)
{
}
......@@ -447,7 +450,7 @@ void CdbDebugEnginePrivate::clearForRun()
qDebug() << Q_FUNC_INFO;
m_breakEventMode = BreakEventHandle;
m_eventThreadId = -1;
m_eventThreadId = m_interruptArticifialThreadId = -1;
m_interrupted = false;
cleanStackTrace();
}
......@@ -619,6 +622,8 @@ void CdbDebugEnginePrivate::checkVersion()
void CdbDebugEngine::startDebugger(const QSharedPointer<DebuggerStartParameters> &sp)
{
if (debugCDBExecution)
qDebug() << "startDebugger" << *sp;
setState(AdapterStarting, Q_FUNC_INFO, __LINE__);
m_d->checkVersion();
if (m_d->m_hDebuggeeProcess) {
......@@ -627,6 +632,7 @@ void CdbDebugEngine::startDebugger(const QSharedPointer<DebuggerStartParameters>
emit startFailed();
}
m_d->clearDisplay();
m_d->m_inferiorStartupComplete = false;
setState(AdapterStarted, Q_FUNC_INFO, __LINE__);
setState(InferiorPreparing, Q_FUNC_INFO, __LINE__);
......@@ -699,10 +705,11 @@ bool CdbDebugEngine::startAttachDebugger(qint64 pid, DebuggerStartMode sm, QStri
{
// Need to attrach invasively, otherwise, no notification signals
// for for CreateProcess/ExitProcess occur.
const ULONG flags = DEBUG_ATTACH_INVASIVE_RESUME_PROCESS;
// As of version 6.11, the initial breakpoint suppression has no effect (see notifyException).
const ULONG flags = DEBUG_ATTACH_INVASIVE_RESUME_PROCESS|DEBUG_ATTACH_INVASIVE_NO_INITIAL_BREAK;
const HRESULT hr = m_d->m_cif.debugClient->AttachProcess(NULL, pid, flags);
if (debugCDB)
qDebug() << "Attaching to " << pid << " returns " << hr << executionStatusString(m_d->m_cif.debugControl);
qDebug() << "Attaching to " << pid << " using flags" << flags << " returns " << hr << executionStatusString(m_d->m_cif.debugControl);
if (FAILED(hr)) {
*errorMessage = tr("Attaching to a process failed for process id %1: %2").arg(pid).arg(msgDebugEngineComResult(hr));
return false;
......@@ -771,7 +778,7 @@ bool CdbDebugEngine::startDebuggerWithExecutable(DebuggerStartMode sm, QString *
}
void CdbDebugEnginePrivate::processCreatedAttached(ULONG64 processHandle, ULONG64 initialThreadHandle)
{
{
m_engine->setState(InferiorRunningRequested, Q_FUNC_INFO, __LINE__);
setDebuggeeHandles(reinterpret_cast<HANDLE>(processHandle), reinterpret_cast<HANDLE>(initialThreadHandle));
ULONG currentThreadId;
......@@ -782,8 +789,11 @@ void CdbDebugEnginePrivate::processCreatedAttached(ULONG64 processHandle, ULONG6
}
// Clear any saved breakpoints and set initial breakpoints
m_engine->executeDebuggerCommand(QLatin1String("bc"));
if (manager()->breakHandler()->hasPendingBreakpoints())
if (manager()->breakHandler()->hasPendingBreakpoints()) {
if (debugCDBExecution)
qDebug() << "processCreatedAttached: Syncing breakpoints";
m_engine->attemptBreakpointSynchronization();
}
// Attaching to crashed: This handshake (signalling an event) is required for
// the exception to be delivered to the debugger
if (m_mode == AttachCrashedExternal) {
......@@ -796,8 +806,8 @@ void CdbDebugEnginePrivate::processCreatedAttached(ULONG64 processHandle, ULONG6
}
}
m_engine->setState(InferiorRunning, Q_FUNC_INFO, __LINE__);
if (debugCDB)
qDebug() << Q_FUNC_INFO << '\n' << executionStatusString(m_cif.debugControl);
if (debugCDBExecution)
qDebug() << "<processCreatedAttached" << executionStatusString(m_cif.debugControl);
}
void CdbDebugEngine::processTerminated(unsigned long exitCode)
......@@ -1018,8 +1028,8 @@ static inline QString msgStepFailed(unsigned long executionStatus, int threadId,
// its reverse equivalents in the case of single threads.
bool CdbDebugEngine::step(unsigned long executionStatus)
{
if (debugCDB)
qDebug() << Q_FUNC_INFO << executionStatus << "curr " << m_d->m_currentThreadId << " evt " << m_d->m_eventThreadId;
if (debugCDBExecution)
qDebug() << ">step" << executionStatus << "curr " << m_d->m_currentThreadId << " evt " << m_d->m_eventThreadId;
// State of reverse stepping as of 10/2009 (Debugging tools 6.11@404):
// The constants exist, but invoking the calls leads to E_NOINTERFACE.
......@@ -1029,6 +1039,12 @@ bool CdbDebugEngine::step(unsigned long executionStatus)
return false;
}
// Do not step the artifical thread created to interrupt the debuggee.
if (m_d->m_interrupted && m_d->m_currentThreadId == m_d->m_interruptArticifialThreadId) {
warning(tr("Thread %1 cannot be stepped.").arg(m_d->m_currentThreadId));
return false;
}
// SetExecutionStatus() continues the thread that triggered the
// stop event (~# p). This can be confusing if the user is looking
// at the stack trace of another thread and wants to step that one. If that
......@@ -1067,6 +1083,8 @@ bool CdbDebugEngine::step(unsigned long executionStatus)
} else {
setState(InferiorStopped, Q_FUNC_INFO, __LINE__);
}
if (debugCDBExecution)
qDebug() << "<step samethread" << sameThread << "succeeded" << success;
return success;
}
......@@ -1092,8 +1110,8 @@ void CdbDebugEngine::nextIExec()
void CdbDebugEngine::stepOutExec()
{
if (debugCDB)
qDebug() << Q_FUNC_INFO;
if (debugCDBExecution)
qDebug() << "stepOutExec";
// emulate gdb 'exec-finish' (exec until return of current function)
// by running up to address of the above stack frame (mostly works).
const StackHandler* sh = manager()->stackHandler();
......@@ -1142,8 +1160,8 @@ void CdbDebugEngine::continueInferior()
// Continue process without notifications
bool CdbDebugEnginePrivate::continueInferiorProcess(QString *errorMessagePtr /* = 0 */)
{
if (debugCDB)
qDebug() << Q_FUNC_INFO;
if (debugCDBExecution)
qDebug() << "continueInferiorProcess";
const HRESULT hr = m_cif.debugControl->SetExecutionStatus(DEBUG_STATUS_GO);
if (FAILED(hr)) {
const QString errorMessage = msgComFailed("SetExecutionStatus", hr);
......@@ -1198,11 +1216,12 @@ bool CdbDebugEnginePrivate::continueInferior(QString *errorMessage)
bool CdbDebugEnginePrivate::interruptInterferiorProcess(QString *errorMessage)
{
// Interrupt the interferior process without notifications
if (debugCDB) {
if (debugCDBExecution) {
ULONG executionStatus;
getExecutionStatus(m_cif.debugControl, &executionStatus, errorMessage);
qDebug() << Q_FUNC_INFO << "\n ex=" << executionStatus;
qDebug() << "interruptInterferiorProcess ex=" << executionStatus;
}
if (DebugBreakProcess(m_hDebuggeeProcess)) {
......@@ -1218,6 +1237,7 @@ bool CdbDebugEnginePrivate::interruptInterferiorProcess(QString *errorMessage)
arg(getInterruptTimeOutSecs(m_cif.debugControl)).arg(msgComFailed("SetInterrupt", hr));
return false;
}
m_interrupted = true;
#endif
return true;
}
......@@ -1646,10 +1666,27 @@ void CdbDebugEngine::warning(const QString &w)
qWarning("%s\n", qPrintable(w));
}
void CdbDebugEnginePrivate::notifyCrashed()
void CdbDebugEnginePrivate::notifyException(long code, bool fatal)
{
if (debugCDBExecution)
qDebug() << "notifyException code" << code << " fatal=" << fatal;
// Suppress the initial breakpoint that occurs when
// attaching (If a breakpoint is encountered before startup
// is complete).
switch (code) {
case winExceptionStartupCompleteTrap:
m_inferiorStartupComplete = true;
break;
case EXCEPTION_BREAKPOINT:
if (!m_inferiorStartupComplete && m_breakEventMode == BreakEventHandle) {
manager()->showDebuggerOutput(LogMisc, CdbDebugEngine::tr("Ignoring initial breakpoint..."));
m_breakEventMode = BreakEventIgnoreOnce;
}
break;
}
// Cannot go over crash point to execute calls.
m_dumper->disable();
if (fatal)
m_dumper->disable();
}
static int threadIndexById(const ThreadsHandler *threadsHandler, int id)
......@@ -1664,10 +1701,10 @@ static int threadIndexById(const ThreadsHandler *threadsHandler, int id)
void CdbDebugEnginePrivate::handleDebugEvent()
{
if (debugCDB)
qDebug() << Q_FUNC_INFO << '\n' << m_hDebuggeeProcess << m_breakEventMode
<< executionStatusString(m_cif.debugControl);
if (debugCDBExecution)
qDebug() << "handleDebugEvent mode " << m_breakEventMode
<< executionStatusString(m_cif.debugControl) << " interrupt" << m_interrupted
<< " startupcomplete" << m_inferiorStartupComplete;
// restore mode and do special handling
const HandleBreakEventMode mode = m_breakEventMode;
m_breakEventMode = BreakEventHandle;
......@@ -1679,9 +1716,27 @@ void CdbDebugEnginePrivate::handleDebugEvent()
if (m_engine->state() != InferiorStopping)
m_engine->setState(InferiorStopping, Q_FUNC_INFO, __LINE__);
m_engine->setState(InferiorStopped, Q_FUNC_INFO, __LINE__);
m_eventThreadId = m_currentThreadId = updateThreadList();
manager()->showDebuggerOutput(LogMisc, CdbDebugEngine::tr("Stopped, current thread: %1").arg(m_currentThreadId));
m_eventThreadId = updateThreadList();
m_interruptArticifialThreadId = m_interrupted ? m_eventThreadId : -1;
// Get thread to stop and its index. If avoidable, do not use
// the artifical thread that is created when interrupting,
// use the oldest thread 0 instead.
ThreadsHandler *threadsHandler = manager()->threadsHandler();
m_currentThreadId = m_interrupted ? 0 : m_eventThreadId;
int currentThreadIndex = -1;
m_currentThreadId = -1;
if (m_interrupted) {
m_currentThreadId = 0;
currentThreadIndex = threadIndexById(threadsHandler, m_currentThreadId);
}
if (!m_interrupted || currentThreadIndex == -1) {
m_currentThreadId = m_eventThreadId;
currentThreadIndex = threadIndexById(threadsHandler, m_currentThreadId);
}
const QString msg = m_interrupted ?
CdbDebugEngine::tr("Interrupted in thread %1, current thread: %2").arg(m_interruptArticifialThreadId).arg(m_currentThreadId) :
CdbDebugEngine::tr("Stopped, current thread: %1").arg(m_currentThreadId);
manager()->showDebuggerOutput(LogMisc, msg);
const int threadIndex = threadIndexById(threadsHandler, m_currentThreadId);
if (threadIndex != -1)
threadsHandler->setCurrentThread(threadIndex);
......@@ -1690,8 +1745,10 @@ void CdbDebugEnginePrivate::handleDebugEvent()
break;
case BreakEventIgnoreOnce:
m_engine->startWatchTimer();
m_interrupted = false;
break;
case BreakEventSyncBreakPoints: {
m_interrupted = false;
// Temp stop to sync breakpoints
QString errorMessage;
attemptBreakpointSynchronization(&errorMessage);
......@@ -1764,9 +1821,12 @@ static inline unsigned long dumperThreadId(const QList<StackFrame> &frames,
return CdbDumperHelper::InvalidDumperCallThread;
const int waitCheckDepth = qMin(frames.size(), 5);
static const QString waitForPrefix = QLatin1String(CdbStackTraceContext::winFuncWaitForPrefix);
for (int f = 0; f < waitCheckDepth; f++)
if (frames.at(f).function.startsWith(waitForPrefix))
static const QString msgWaitForPrefix = QLatin1String(CdbStackTraceContext::winFuncMsgWaitForPrefix);
for (int f = 0; f < waitCheckDepth; f++) {
const QString &function = frames.at(f).function;
if (function.startsWith(waitForPrefix) || function.startsWith(msgWaitForPrefix))
return CdbDumperHelper::InvalidDumperCallThread;
}
return currentThread;
}
......@@ -1812,7 +1872,7 @@ void CdbDebugEnginePrivate::updateStackTrace()
}
// Set up dumper with a thread (or invalid)
const unsigned long dumperThread = dumperThreadId(stackFrames, m_currentThreadId);
if (debugCDB)
if (debugCDBExecution)
qDebug() << "updateStackTrace() current: " << m_currentThreadId << " dumper=" << dumperThread;
m_dumper->setDumperCallThread(dumperThread);
// Display frames
......@@ -1824,6 +1884,10 @@ void CdbDebugEnginePrivate::updateStackTrace()
if (m_dumper->isEnabled() && m_dumper->state() != CdbDumperHelper::Initialized)
QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
m_engine->activateFrame(current);
} else {
// Clean out variables
manager()->watchHandler()->beginCycle();
manager()->watchHandler()->endCycle();
}
manager()->watchHandler()->updateWatchers();
}
......
......@@ -135,7 +135,7 @@ struct CdbDebugEnginePrivate
bool executeContinueCommand(const QString &command);
bool attemptBreakpointSynchronization(QString *errorMessage);
void notifyCrashed();
void notifyException(long code, bool fatal);
enum EndInferiorAction { DetachInferior, TerminateInferior };
bool endInferior(EndInferiorAction a, QString *errorMessage);
......@@ -157,9 +157,10 @@ struct CdbDebugEnginePrivate
const QSharedPointer<CdbOptions> m_options;
HANDLE m_hDebuggeeProcess;
HANDLE m_hDebuggeeThread;
bool m_interrupted;
bool m_interrupted;
int m_currentThreadId;
int m_eventThreadId;
int m_interruptArticifialThreadId;
HandleBreakEventMode m_breakEventMode;
int m_watchTimer;
......@@ -175,6 +176,7 @@ struct CdbDebugEnginePrivate
EditorToolTipCache m_editorToolTipCache;
bool m_firstActivatedFrame;
bool m_inferiorStartupComplete;
DebuggerStartMode m_mode;
Utils::ConsoleProcess m_consoleStubProc;
......@@ -192,6 +194,7 @@ QString msgDebugEngineComResult(HRESULT hr);
QString msgComFailed(const char *func, HRESULT hr);
enum { debugCDB = 0 };
enum { debugCDBExecution = 0 };
enum { debugCDBWatchHandling = 0 };
} // namespace Internal
......
......@@ -35,6 +35,7 @@
#include <QtCore/QDebug>
#include <QtCore/QTextStream>
#include <QtCore/QCoreApplication>
namespace Debugger {
namespace Internal {
......@@ -249,8 +250,7 @@ STDMETHODIMP CdbDebugEventCallback::Exception(
qDebug() << Q_FUNC_INFO << "\nex=" << Exception->ExceptionCode << " fatal=" << fatal << msg;
m_pEngine->manager()->showApplicationOutput(msg);
m_pEngine->manager()->showDebuggerOutput(LogMisc, msg);
if (fatal)
m_pEngine->m_d->notifyCrashed();
m_pEngine->m_d->notifyException(Exception->ExceptionCode, fatal);
return S_OK;
}
......@@ -373,8 +373,11 @@ STDMETHODIMP CdbDebugEventCallback::SystemError(
}
// -----------ExceptionLoggerEventCallback
CdbExceptionLoggerEventCallback::CdbExceptionLoggerEventCallback(int logChannel, DebuggerManager *manager) :
CdbExceptionLoggerEventCallback::CdbExceptionLoggerEventCallback(int logChannel,
bool skipNonFatalExceptions,
DebuggerManager *manager) :
m_logChannel(logChannel),
m_skipNonFatalExceptions(skipNonFatalExceptions),
m_manager(manager)
{
}
......@@ -391,15 +394,18 @@ STDMETHODIMP CdbExceptionLoggerEventCallback::Exception(
__in ULONG /* FirstChance */
)
{
m_exceptionCodes.push_back(Exception->ExceptionCode);
m_exceptionMessages.push_back(QString());
{
QTextStream str(&m_exceptionMessages.back());
formatException(Exception, str);
const bool recordException = !m_skipNonFatalExceptions || isFatalException(Exception->ExceptionCode);
QString message;
formatException(Exception, QTextStream(&message));
if (recordException) {
m_exceptionCodes.push_back(Exception->ExceptionCode);
m_exceptionMessages.push_back(message);
}
if (debugCDB)
qDebug() << Q_FUNC_INFO << '\n' << m_exceptionMessages.back();
m_manager->showDebuggerOutput(m_logChannel, m_exceptionMessages.back());
qDebug() << Q_FUNC_INFO << '\n' << message;
m_manager->showDebuggerOutput(m_logChannel, message);
if (recordException)
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
return S_OK;
}
......
......@@ -242,7 +242,9 @@ private:
class CdbExceptionLoggerEventCallback : public CdbDebugEventCallbackBase
{
public:
CdbExceptionLoggerEventCallback(int logChannel, DebuggerManager *access);
CdbExceptionLoggerEventCallback(int logChannel,
bool skipNonFatalExceptions,
DebuggerManager *access);
STDMETHOD(GetInterestMask)(
THIS_
......@@ -261,6 +263,7 @@ public:
private:
const int m_logChannel;
const bool m_skipNonFatalExceptions;
DebuggerManager *m_manager;
QList<ULONG> m_exceptionCodes;
QStringList m_exceptionMessages;
......
......@@ -144,13 +144,14 @@ static bool createDebuggeeAscIIString(CdbComInterfaces *cif,
// make sense for Qt apps.
static bool debuggeeLoadLibrary(DebuggerManager *manager,
CdbComInterfaces *cif,
unsigned long threadId,
const QString &moduleName,
QString *errorMessage)
{
if (loadDebug > 1)
qDebug() << Q_FUNC_INFO << moduleName;
// Try to ignore the breakpoints
CdbExceptionLoggerEventCallback exLogger(LogWarning, manager);
// Try to ignore the breakpoints, skip stray startup-complete trap exceptions
CdbExceptionLoggerEventCallback exLogger(LogWarning, true, manager);
EventCallbackRedirector eventRedir(cif->debugClient, &exLogger);
// Make a call to LoadLibraryA. First, reserve memory in debugger
// and copy name over.
......@@ -178,7 +179,9 @@ static bool debuggeeLoadLibrary(DebuggerManager *manager,
if (!CdbDebugEnginePrivate::executeDebuggerCommand(cif->debugControl, callCmd, errorMessage))
return false;
// Execute current thread. This will hit a breakpoint.
if (!CdbDebugEnginePrivate::executeDebuggerCommand(cif->debugControl, QLatin1String("~. g"), errorMessage))
QString goCmd;