diff options
-rw-r--r-- | src/plugins/debugger/cdb/cdbengine.cpp | 4 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerengine.cpp | 45 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerengine.h | 6 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerplugin.cpp | 19 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerruncontrol.cpp | 4 | ||||
-rw-r--r-- | src/plugins/debugger/debuggerruncontrol.h | 3 | ||||
-rw-r--r-- | src/plugins/debugger/gdb/gdbengine.cpp | 4 | ||||
-rw-r--r-- | src/plugins/debugger/lldb/lldbengine.cpp | 2 | ||||
-rw-r--r-- | src/plugins/debugger/qml/qmlcppengine.cpp | 20 | ||||
-rw-r--r-- | src/plugins/debugger/qml/qmlcppengine.h | 6 |
10 files changed, 44 insertions, 69 deletions
diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index a0848e5d9d..0bdbadf4b4 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -838,7 +838,7 @@ void CdbEngine::shutdownEngine() void CdbEngine::abortDebugger() { - if (targetState() == DebuggerFinished) { + if (isDying()) { // We already tried. Try harder. showMessage("ABORTING DEBUGGER. SECOND TIME."); m_process.kill(); @@ -1834,7 +1834,7 @@ unsigned CdbEngine::examineStopReason(const GdbMi &stopReason, { // Report stop reason (GDBMI) unsigned rc = 0; - if (targetState() == DebuggerFinished) + if (isDying()) rc |= StopShutdownInProgress; if (debug) qDebug("%s", qPrintable(stopReason.toString(true, 4))); diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index ea8d59b339..898302a68e 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -348,9 +348,6 @@ public: // The state we had before something unexpected happend. DebuggerState m_lastGoodState = DebuggerNotReady; - // The state we are aiming for. - DebuggerState m_targetState = DebuggerNotReady; - // State of RemoteSetup signal/slots. RemoteSetupState m_remoteSetupState = RemoteSetupNone; @@ -451,11 +448,6 @@ void DebuggerEngine::doUpdateLocals(const UpdateParameters &) { } -void DebuggerEngine::setTargetState(DebuggerState state) -{ - d->m_targetState = state; -} - ModulesHandler *DebuggerEngine::modulesHandler() const { return d->m_masterEngine @@ -576,7 +568,6 @@ void DebuggerEngine::start() QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished, qDebug() << state()); d->m_lastGoodState = DebuggerNotReady; - d->m_targetState = DebuggerNotReady; d->m_progress.setProgressValue(200); d->m_terminal.setup(); @@ -678,11 +669,6 @@ DebuggerState DebuggerEngine::lastGoodState() const return d->m_lastGoodState; } -DebuggerState DebuggerEngine::targetState() const -{ - return d->m_targetState; -} - static bool isAllowedTransition(DebuggerState from, DebuggerState to) { switch (from) { @@ -795,8 +781,10 @@ void DebuggerEngine::notifyEngineSetupOk() QTC_ASSERT(state() == EngineSetupRequested, qDebug() << this << state()); setState(EngineSetupOk); - - d->queueSetupInferior(); + if (isMasterEngine() && runTool()) { + runTool()->reportStarted(); + d->queueSetupInferior(); + } } void DebuggerEngine::setupSlaveInferior() @@ -1045,7 +1033,6 @@ void DebuggerEnginePrivate::doShutdownInferior() //QTC_ASSERT(isMasterEngine(), return); QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << m_engine << state()); resetLocation(); - m_targetState = DebuggerFinished; m_engine->showMessage("CALL: SHUTDOWN INFERIOR"); m_engine->shutdownInferior(); } @@ -1074,7 +1061,7 @@ void DebuggerEngine::notifyInferiorIll() showMessage("NOTE: INFERIOR ILL"); // This can be issued in almost any state. The inferior could still be // alive as some previous notifications might have been bogus. - d->m_targetState = DebuggerFinished; + runTool()->startDying(); d->m_lastGoodState = d->m_state; if (state() == InferiorRunRequested) { // We asked for running, but did not see a response. @@ -1097,7 +1084,7 @@ void DebuggerEnginePrivate::doShutdownEngine() { QTC_ASSERT(isMasterEngine(), qDebug() << m_engine; return); QTC_ASSERT(state() == EngineShutdownRequested, qDebug() << m_engine << state()); - m_targetState = DebuggerFinished; + runTool()->startDying(); m_engine->showMessage("CALL: SHUTDOWN ENGINE"); m_engine->shutdownEngine(); } @@ -1160,7 +1147,7 @@ void DebuggerEngine::notifyEngineIll() CALLGRIND_DUMP_STATS; #endif showMessage("NOTE: ENGINE ILL ******"); - d->m_targetState = DebuggerFinished; + runTool()->startDying(); d->m_lastGoodState = d->m_state; switch (state()) { case InferiorRunRequested: @@ -1288,12 +1275,6 @@ void DebuggerEngine::setState(DebuggerState state, bool forced) DebuggerToolTipManager::registerEngine(this); } - if (state == InferiorUnrunnable || state == InferiorRunOk) { - // FIXME: Called again for combined engine. - if (isMasterEngine() && runTool() && !runTool()->runControl()->isRunning()) - runTool()->reportStarted(); - } - if (state == DebuggerFinished) { // Give up ownership on claimed breakpoints. foreach (Breakpoint bp, breakHandler()->engineBreakpoints(this)) @@ -1473,7 +1454,8 @@ void DebuggerEngine::showMessage(const QString &msg, int channel, int timeout) c void DebuggerEngine::quitDebugger() { showMessage(QString("QUIT DEBUGGER REQUESTED IN STATE %1").arg(state())); - d->m_targetState = DebuggerFinished; + QTC_ASSERT(runTool(), return); + runTool()->startDying(); switch (state()) { case InferiorStopOk: case InferiorStopFailed: @@ -1768,13 +1750,6 @@ void DebuggerEngine::detachDebugger() { } -void DebuggerEngine::exitDebugger() -{ - QTC_ASSERT(d->m_state == InferiorStopOk || d->m_state == InferiorUnrunnable - || d->m_state == InferiorRunOk, qDebug() << d->m_state); - quitDebugger(); -} - void DebuggerEngine::executeStep() { } @@ -1831,7 +1806,7 @@ BreakHandler *DebuggerEngine::breakHandler() const bool DebuggerEngine::isDying() const { - return targetState() == DebuggerFinished; + return !runTool() || runTool()->isDying(); } QString DebuggerEngine::msgStopped(const QString &reason) diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index b8c068549d..1ebaca564c 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -302,7 +302,6 @@ public: DebuggerState state() const; DebuggerState lastGoodState() const; - DebuggerState targetState() const; bool isDying() const; static QString stateName(int s); @@ -319,9 +318,8 @@ public: virtual void resetLocation(); virtual void gotoLocation(const Internal::Location &location); - Q_SLOT virtual void quitDebugger(); // called by DebuggerRunControl - virtual void exitDebugger(); // called by DebuggerRunControl - virtual void abortDebugger(); // called by DebuggerPlugin + virtual void quitDebugger(); // called when pressing the stop button + virtual void abortDebugger(); // called from the debug menu action void updateViews(); bool isSlaveEngine() const; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index a5b23bb3bf..bc1c7ed2d6 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -930,11 +930,10 @@ public: currentEngine()->watchHandler()->watchVariable(exp); } - void handleExecExit() + void stopDebugger() { QTC_ASSERT(dd->m_currentRunTool, return); - return dd->m_currentRunTool->runControl()->initiateStop(); - //currentEngine()->exitDebugger(); + dd->m_currentRunTool->runControl()->initiateStop(); } void handleFrameDown() @@ -1416,7 +1415,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, act = m_exitAction = new QAction(tr("Stop Debugger"), this); act->setIcon(Icons::DEBUG_EXIT_SMALL.icon()); - connect(act, &QAction::triggered, this, &DebuggerPluginPrivate::handleExecExit); + connect(act, &QAction::triggered, this, &DebuggerPluginPrivate::stopDebugger); act = m_interruptAction = new QAction(tr("Interrupt"), this); act->setIcon(visibleStartIcon(Id(Constants::INTERRUPT), false)); @@ -2828,10 +2827,8 @@ void DebuggerPluginPrivate::coreShutdown() { m_shuttingDown = true; if (currentEngine()) { - if (currentEngine()->state() != Debugger::DebuggerNotReady) { - currentEngine()->setTargetState(Debugger::DebuggerFinished); + if (currentEngine()->state() != Debugger::DebuggerNotReady) currentEngine()->abortDebugger(); - } } } @@ -3044,8 +3041,9 @@ void DebuggerPluginPrivate::extensionsInitialized() DebuggerEngine *currentEngine() { - QTC_ASSERT(dd->m_currentRunTool, return dd->dummyEngine()); - DebuggerEngine *engine = dd->m_currentRunTool->activeEngine(); + DebuggerEngine *engine = nullptr; + if (dd->m_currentRunTool) + engine = dd->m_currentRunTool->activeEngine(); return engine ? engine : dd->dummyEngine(); } @@ -3369,7 +3367,8 @@ void DebuggerPluginPrivate::updateUiForTarget(Target *target) void DebuggerPluginPrivate::updateActiveLanguages() { - QTC_ASSERT(dd->m_currentRunTool, return); + if (!dd->m_currentRunTool) + return; const DebuggerLanguages languages = dd->m_currentRunTool->runParameters().languages; // Id perspective = (languages & QmlLanguage) && !(languages & CppLanguage) // ? QmlPerspectiveId : CppPerspectiveId; diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index be1e107842..f364813350 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -176,7 +176,8 @@ void DebuggerRunTool::notifyEngineRemoteSetupFinished(const RemoteSetupResult &r void DebuggerRunTool::stop() { - m_engine->exitDebugger(); + m_isDying = true; + m_engine->quitDebugger(); } void DebuggerRunTool::onTargetFailure() @@ -223,6 +224,7 @@ void DebuggerRunTool::notifyInferiorExited() void DebuggerRunTool::quitDebugger() { + m_isDying = true; m_engine->quitDebugger(); } diff --git a/src/plugins/debugger/debuggerruncontrol.h b/src/plugins/debugger/debuggerruncontrol.h index 1817e9767c..91a90880ad 100644 --- a/src/plugins/debugger/debuggerruncontrol.h +++ b/src/plugins/debugger/debuggerruncontrol.h @@ -78,6 +78,8 @@ public: Internal::DebuggerRunParameters &runParameters(); const Internal::DebuggerRunParameters &runParameters() const; + void startDying() { m_isDying = true; } + bool isDying() const { return m_isDying; } bool isCppDebugging() const { return m_isCppDebugging; } bool isQmlDebugging() const { return m_isQmlDebugging; } int portsUsedByDebugger() const; @@ -94,6 +96,7 @@ private: Internal::DebuggerEngine *m_engine = nullptr; // Master engine Internal::DebuggerRunParameters m_runParameters; QStringList m_errors; + bool m_isDying = false; const bool m_isCppDebugging; const bool m_isQmlDebugging; }; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 3ff75994a4..b51cf04606 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -272,7 +272,7 @@ QString GdbEngine::errorMessage(QProcess::ProcessError error) "permissions to invoke the program.\n%2") .arg(runParameters().debugger.executable, m_gdbProc.errorString()); case QProcess::Crashed: - if (targetState() == DebuggerFinished) + if (isDying()) return tr("The gdb process crashed some time after starting " "successfully."); else @@ -4085,7 +4085,7 @@ void GdbEngine::handleGdbFinished(int exitCode, QProcess::ExitStatus exitStatus) void GdbEngine::abortDebugger() { - if (targetState() == DebuggerFinished) { + if (isDying()) { // We already tried. Try harder. showMessage("ABORTING DEBUGGER. SECOND TIME."); m_gdbProc.kill(); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 65a716332d..4852185929 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -163,7 +163,7 @@ void LldbEngine::shutdownEngine() void LldbEngine::abortDebugger() { - if (targetState() == DebuggerFinished) { + if (isDying()) { // We already tried. Try harder. showMessage("ABORTING DEBUGGER. SECOND TIME."); m_lldbProc.kill(); diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp index 11d04e219b..a678a71ea3 100644 --- a/src/plugins/debugger/qml/qmlcppengine.cpp +++ b/src/plugins/debugger/qml/qmlcppengine.cpp @@ -68,7 +68,7 @@ QmlCppEngine::QmlCppEngine(DebuggerEngine *cppEngine, bool useTerminal) m_qmlEngine->setMasterEngine(this); m_cppEngine = cppEngine; m_cppEngine->setMasterEngine(this); - setActiveEngine(m_cppEngine); + m_activeEngine = m_cppEngine; } QmlCppEngine::~QmlCppEngine() @@ -271,11 +271,6 @@ void QmlCppEngine::assignValueInDebugger(WatchItem *item, void QmlCppEngine::notifyInferiorIll() { - //This will eventually shutdown the engine - //Set final state to avoid quitDebugger() being called - //after this call - setTargetState(DebuggerFinished); - //Call notifyInferiorIll of cpp engine //as qml engine will follow state transitions //of cpp engine @@ -378,7 +373,7 @@ void QmlCppEngine::executeDebuggerCommand(const QString &command, DebuggerLangua void QmlCppEngine::setupEngine() { EDEBUG("\nMASTER SETUP ENGINE"); - setActiveEngine(m_cppEngine); + m_activeEngine = m_cppEngine; m_qmlEngine->setupSlaveEngine(); m_cppEngine->setupSlaveEngine(); @@ -474,6 +469,7 @@ void QmlCppEngine::slaveEngineStateChanged DebuggerEngine *otherEngine = (slaveEngine == m_cppEngine) ? m_qmlEngine : m_cppEngine; + QTC_ASSERT(otherEngine, return); QTC_CHECK(otherEngine != slaveEngine); if (debug) { @@ -584,9 +580,11 @@ void QmlCppEngine::slaveEngineStateChanged if (state() == InferiorRunOk) { setState(InferiorStopRequested); } else if (state() == InferiorStopOk) { - notifyInferiorRunRequested(); - notifyInferiorRunOk(); - setState(InferiorStopRequested); + if (!isDying()) { + notifyInferiorRunRequested(); + notifyInferiorRunOk(); + setState(InferiorStopRequested); + } } else if (state() == InferiorRunRequested) { notifyInferiorRunOk(); setState(InferiorStopRequested); @@ -606,7 +604,7 @@ void QmlCppEngine::slaveEngineStateChanged || state() == InferiorStopOk, qDebug() << state()); // Just to make sure, we're shutting down anyway ... - setActiveEngine(m_cppEngine); + m_activeEngine = m_cppEngine; if (state() == InferiorStopRequested) setState(InferiorStopOk); diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h index 9f670a32a0..25d46c593d 100644 --- a/src/plugins/debugger/qml/qmlcppengine.h +++ b/src/plugins/debugger/qml/qmlcppengine.h @@ -132,9 +132,9 @@ private: void setActiveEngine(DebuggerEngine *engine); private: - QmlEngine *m_qmlEngine; - DebuggerEngine *m_cppEngine; - DebuggerEngine *m_activeEngine; + QPointer<QmlEngine> m_qmlEngine; + QPointer<DebuggerEngine> m_cppEngine; + QPointer<DebuggerEngine> m_activeEngine; }; } // namespace Internal |