diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 7f3e42f47fa122af31fd00454dbd7ca595c141ee..21313428aefbdc14eca3592321211140176a10b4 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -107,11 +107,14 @@ DebuggerRunControl::DebuggerRunControl(DebuggerManager *manager, : RunControl(runConfiguration), m_manager(manager), m_running(false) { connect(m_manager, SIGNAL(debuggingFinished()), - this, SLOT(debuggingFinished())); + this, SLOT(debuggingFinished()), + Qt::QueuedConnection); connect(m_manager, SIGNAL(applicationOutputAvailable(QString)), - this, SLOT(slotAddToOutputWindowInline(QString))); + this, SLOT(slotAddToOutputWindowInline(QString)), + Qt::QueuedConnection); connect(m_manager, SIGNAL(inferiorPidChanged(qint64)), - this, SLOT(bringApplicationToForeground(qint64))); + this, SLOT(bringApplicationToForeground(qint64)), + Qt::QueuedConnection); } void DebuggerRunControl::start() diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 663bd7c38cfa6b184c54fb66e84b01ed17a4768b..3238862d355fbaf83f0ccd089bc706c9e97218b0 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -250,23 +250,16 @@ GdbEngine::GdbEngine(DebuggerManager *parent) { q = parent; qq = parent->engineInterface(); - init(); + initializeVariables(); + initializeConnections(); } GdbEngine::~GdbEngine() { } -void GdbEngine::init() +void GdbEngine::initializeConnections() { - m_pendingRequests = 0; - m_waitingForBreakpointSynchronizationToContinue = false; - m_gdbVersion = 100; - m_outputCodec = QTextCodec::codecForLocale(); - m_dataDumperState = DataDumperUninitialized; - - m_oldestAcceptableToken = -1; - // Gdb Process interaction connect(&m_gdbProc, SIGNAL(error(QProcess::ProcessError)), this, SLOT(gdbProcError(QProcess::ProcessError))); @@ -294,6 +287,22 @@ void GdbEngine::init() Qt::QueuedConnection); } +void GdbEngine::initializeVariables() +{ + m_dataDumperState = DataDumperUninitialized; + m_gdbVersion = 100; + + m_fullToShortName.clear(); + m_shortToFullName.clear(); + m_varToType.clear(); + + m_modulesListOutdated = true; + m_oldestAcceptableToken = -1; + m_outputCodec = QTextCodec::codecForLocale(); + m_pendingRequests = 0; + m_waitingForBreakpointSynchronizationToContinue = false; +} + void GdbEngine::gdbProcError(QProcess::ProcessError error) { QString msg; @@ -1109,6 +1118,8 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data) sendCommand("set auto-solib-add off"); sendCommand("set stop-on-solib-events 0"); } + // nicer to see a bit of the world we live in + reloadModules(); // this will "continue" if done m_waitingForBreakpointSynchronizationToContinue = true; QTimer::singleShot(0, this, SLOT(attemptBreakpointSynchronization())); @@ -1118,7 +1129,6 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data) // fall through } - static bool modulesDirty = false; if (msg.contains("Stopped due to shared library event") || reason.isEmpty()) { if (qq->wantsSelectedPluginBreakpoints()) { qDebug() << "SHARED LIBRARY EVENT " << data.toString(); @@ -1128,7 +1138,7 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data) q->showStatusMessage(tr("Loading %1...").arg(QString(data.toString()))); return; } - modulesDirty = true; + m_modulesListOutdated = true; // fall through } @@ -1183,11 +1193,11 @@ void GdbEngine::handleAsyncOutput(const GdbMi &data) } if (isStoppedReason(reason) || reason.isEmpty()) { - if (modulesDirty) { + if (m_modulesListOutdated) { sendCommand("-file-list-exec-source-files", GdbQuerySources); sendCommand("-break-list", BreakList); reloadModules(); - modulesDirty = false; + m_modulesListOutdated = false; } // Need another round trip if (reason == "breakpoint-hit") { @@ -1345,7 +1355,6 @@ void GdbEngine::handleExecRun(const GdbResultRecord &response) if (response.resultClass == GdbResultRunning) { qq->notifyInferiorRunning(); q->showStatusMessage(tr("Running...")); - //reloadModules(); } else if (response.resultClass == GdbResultError) { QString msg = response.data.findChild("msg").data(); if (msg == "Cannot find bounds of current function") { @@ -1433,11 +1442,8 @@ void GdbEngine::exitDebugger() if (m_gdbProc.state() != QProcess::NotRunning) qDebug() << "PROBLEM STOPPING DEBUGGER"; - m_shortToFullName.clear(); - m_fullToShortName.clear(); - m_varToType.clear(); - m_dataDumperState = DataDumperUninitialized; m_outputCollector.shutdown(); + initializeVariables(); //q->settings()->m_debugDumpers = false; } diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h index f41990747d59d3ec281643c4b88f8f57126cc2dc..58021fb765a503360288fff095e427ac5821d5c9 100644 --- a/src/plugins/debugger/gdbengine.h +++ b/src/plugins/debugger/gdbengine.h @@ -144,7 +144,8 @@ private: bool supportsThreads() const; - void init(); // called by destructor + void initializeConnections(); + void initializeVariables(); void queryFullName(const QString &fileName, QString *fullName); QString fullName(const QString &fileName); QString shortName(const QString &fullName); @@ -329,6 +330,7 @@ private: QMap<QString, QString> m_varToType; bool m_waitingForBreakpointSynchronizationToContinue; + bool m_modulesListOutdated; DebuggerManager *q; IDebuggerManagerAccessForEngines *qq;