diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp index a33479a10ba4aa0a169d7ebd2d8b4fe209f86155..c1e7a01534db6e81d6f81bda1980e9d922d55179 100644 --- a/src/plugins/debugger/cdb/cdbdebugengine.cpp +++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp @@ -386,7 +386,7 @@ void CdbDebugEngine::startDebugger() m_d->checkVersion(); if (m_d->m_hDebuggeeProcess) { warning(QLatin1String("Internal error: Attempt to start debugger while another process is being debugged.")); - setState(AdapterStartFailed, Q_FUNC_INFO, __LINE__); + setState(EngineStartFailed, Q_FUNC_INFO, __LINE__); setState(DebuggerNotReady, Q_FUNC_INFO, __LINE__); emit startFailed(); return; @@ -395,7 +395,7 @@ void CdbDebugEngine::startDebugger() case AttachCore: case AttachToRemote: warning(QLatin1String("Internal error: Mode not supported.")); - setState(AdapterStartFailed, Q_FUNC_INFO, __LINE__); + setState(EngineStartFailed, Q_FUNC_INFO, __LINE__); setState(DebuggerNotReady, Q_FUNC_INFO, __LINE__); emit startFailed(); break; @@ -405,7 +405,7 @@ void CdbDebugEngine::startDebugger() m_d->m_mode = sp.startMode; m_d->clearDisplay(); m_d->m_inferiorStartupComplete = false; - setState(AdapterStarted, Q_FUNC_INFO, __LINE__); + setState(EngineStarted, Q_FUNC_INFO, __LINE__); // Options QString errorMessage; if (!m_d->setBreakOnThrow(theDebuggerBoolSetting(BreakOnThrow), &errorMessage)) diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 68ab98a0fe09e2ac0478129fa040fb19f4f63230..9b3430bac6854d18d622940ecc64560e21af8e9b 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -82,8 +82,8 @@ enum DebuggerState EngineStarting, // Engine starts AdapterStarting, - AdapterStarted, - AdapterStartFailed, + EngineStarted, + EngineStartFailed, InferiorUnrunnable, // Used in the core dump adapter InferiorStarting, // InferiorStarted, // Use InferiorRunningRequested or InferiorStopped diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index c8379eeb04860674c56030eb44536517b3ac9b61..6f31a92e7c86347be8cca93b146670b6952f1b0f 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -145,8 +145,8 @@ const char *DebuggerEngine::stateName(int s) SN(DebuggerNotReady) SN(EngineStarting) SN(AdapterStarting) - SN(AdapterStarted) - SN(AdapterStartFailed) + SN(EngineStarted) + SN(EngineStartFailed) SN(InferiorStarting) SN(InferiorStartFailed) SN(InferiorRunningRequested) @@ -912,10 +912,10 @@ static bool isAllowedTransition(int from, int to) return to == AdapterStarting || to == DebuggerNotReady; case AdapterStarting: - return to == AdapterStarted || to == AdapterStartFailed; - case AdapterStarted: + return to == EngineStarted || to == EngineStartFailed; + case EngineStarted: return to == InferiorStarting || to == EngineShuttingDown; - case AdapterStartFailed: + case EngineStartFailed: return to == DebuggerNotReady; case InferiorStarting: @@ -997,8 +997,8 @@ bool DebuggerEngine::debuggerActionsEnabled(DebuggerState state) case DebuggerNotReady: case EngineStarting: case AdapterStarting: - case AdapterStarted: - case AdapterStartFailed: + case EngineStarted: + case EngineStartFailed: case InferiorStartFailed: case InferiorRunningRequested_Kill: case InferiorStopping_Kill: diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 46cf92edf32b8ad975c8df91ff45a8cdb929e379..eb29883364c7a3c5d0d094579ab4db4c2fe7a7de 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -157,45 +157,92 @@ #endif // Note: the Debugger process itself and any helper processes like -// gdbserver, the trk client etc are referred to as 'Adapter', +// gdbserver, the trk client etc are referred to as 'Engine', // whereas the debugged process is referred to as 'Inferior'. // -// 0 == DebuggerNotReady -// | +// Transitions marked by '---' are done in the individual engines. +// Transitions marked by '+-+' are done in the base DebuggerEngine. +// The GdbEngine->startEngine() function is described in more detail below. +// +// DebuggerNotReady +// + +// + // EngineStarting -// | -// AdapterStarting --> AdapterStartFailed --> 0 -// | -// AdapterStarted ------------------------------------. -// | v -// InferiorStarting ----> InferiorStartFailed -------->| -// | | -// (core) | (attach) (term) (remote) | -// .-----------------<-|->------------------. | -// | v | | -// InferiorUnrunnable | (plain) | | -// | | (trk) | | -// | | | | -// | .--> InferiorRunningRequested | | -// | | | | | -// | | InferiorRunning | | -// | | | | | -// | | InferiorStopping | | -// | | | | | -// | '------ InferiorStopped <-----------' | +// + +// + +// (calls *Engine->startEngine()) +// | | +// | `---> EngineStartFailed +// | + +// | [calls RunControl->startFailed] +// | + +// | DebuggerNotReady +// v +// EngineStarted +// + +// [calls RunControl->StartSuccessful] +// + +// (calls *Engine->startInferior()) +// | | +// | ` ----> InferiorStartFailed +-+-+-+->. +// | + +// v + +// InferiorStarted + +// + +// (calls *Engine->runInferior()) + +// | + +// (core) | (attach) (term) (remote) (script) + +// .-----------------<-|->------------------. + +// | v | + +// InferiorUnrunnable | (plain) | + +// | | (trk) | + +// | | | + +// | .--> InferiorRunningRequested | + +// | | | | + +// | | InferiorRunning | + +// | | | | + +// | | InferiorStopping | + +// | | | | + +// | '------ InferiorStopped <-----------' + // | | v -// | InferiorShuttingDown -> InferiorShutdownFailed ---->| -// | | | -// | InferiorShutDown | -// | | | -// '--------> EngineShuttingDown <--------------------------------' +// | InferiorShuttingDown -> InferiorShutdownFailed ---->+ +// | | + +// | InferiorShutDown + +// | | + +// '--------> EngineShuttingDown <-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+' // | -// 0 +// DebuggerNotReady +// + +// GdbEngine specific startup. All happens in EngineStarting state // -// Allowed actions: -// [R] : Run -// [C] : Continue -// [N] : Step, Next +// Transitions marked by '---' are done in the individual adapters. +// Transitions marked by '+-+' are done in the GdbEngine. + +// GdbEngine::startEngine() +// + +// + +// (calls *Adapter->startAdapter()) +// | | +// | `---> handleAdapterStartFailed() +// | + +// | EngineStartFailed +// | +// handleAdapterStarted() +// + +// (calls *Adapter->prepareInferior()) +// | | +// | `---> handleAdapterStartFailed() +// | + +// | EngineStartFailed +// | +// handleInferiorPrepared() +// + +// EngineStarted + + + + using namespace Core; using namespace Debugger; @@ -2629,8 +2676,8 @@ bool DebuggerListener::coreAboutToClose() switch (plugin->state()) { case DebuggerNotReady: return true; - case AdapterStarted: // Most importantly, terminating a running - case AdapterStartFailed: // debuggee can cause problems. + case EngineStarted: // Most importantly, terminating a running + case EngineStartFailed: // debuggee can cause problems. case InferiorUnrunnable: case InferiorStartFailed: case InferiorStopped: diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 56d900ed021b59dc8fabec30b414628634844a2a..b3f6f86cc196c59506c7467ee5100c928057bb0d 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -123,8 +123,8 @@ static bool stateAcceptsGdbCommands(DebuggerState state) { switch (state) { case AdapterStarting: - case AdapterStarted: - case AdapterStartFailed: + case EngineStarted: + case EngineStartFailed: case InferiorUnrunnable: case InferiorStarting: case InferiorStartFailed: @@ -768,7 +768,7 @@ void GdbEngine::postCommandHelper(const GdbCommand &cmd) } else if ((cmd.flags & NeedsStop) || !m_commandsToRunOnTemporaryBreak.isEmpty()) { if (state() == InferiorStopped || state() == InferiorUnrunnable - || state() == InferiorStarting || state() == AdapterStarted) { + || state() == InferiorStarting || state() == EngineStarted) { // Can be safely sent now. flushCommand(cmd); } else { @@ -1636,10 +1636,10 @@ void GdbEngine::shutdown() case InferiorStopping_Kill: break; case AdapterStarting: // GDB is up, adapter is "doing something" - setState(AdapterStartFailed); + setState(EngineStartFailed); m_gdbAdapter->shutdown(); // fall-through - case AdapterStartFailed: // Adapter "did something", but it did not help + case EngineStartFailed: // Adapter "did something", but it did not help if (gdbProc()->state() == QProcess::Running) { m_commandsToRunOnTemporaryBreak.clear(); postCommand("-gdb-exit", GdbEngine::ExitRequest, CB(handleGdbExit)); @@ -1655,7 +1655,7 @@ void GdbEngine::shutdown() postCommand(m_gdbAdapter->inferiorShutdownCommand(), NeedsStop | LosesChild, CB(handleInferiorShutdown)); break; - case AdapterStarted: // We can't get here, really + case EngineStarted: // We can't get here, really case InferiorStartFailed: case InferiorShutDown: case InferiorShutdownFailed: // Whatever @@ -4207,7 +4207,7 @@ void GdbEngine::handleGdbFinished(int code, QProcess::ExitStatus type) } else if (state() == EngineShuttingDown) { showMessage(_("GOING TO SHUT DOWN ADAPTER")); m_gdbAdapter->shutdown(); - } else if (state() != AdapterStartFailed) { + } else if (state() != EngineStartFailed) { QString msg = tr("The gdb process exited unexpectedly (%1).") .arg((type == QProcess::CrashExit) ? tr("crashed") : tr("code %1").arg(code)); @@ -4221,7 +4221,7 @@ void GdbEngine::handleGdbFinished(int code, QProcess::ExitStatus type) void GdbEngine::handleAdapterStartFailed(const QString &msg, const QString &settingsIdHint) { - setState(AdapterStartFailed); + setState(EngineStartFailed); showMessage(_("ADAPTER START FAILED")); if (!msg.isEmpty()) { const QString title = tr("Adapter start failed"); @@ -4237,7 +4237,7 @@ void GdbEngine::handleAdapterStartFailed(const QString &msg, const QString &sett void GdbEngine::handleAdapterStarted() { - setState(AdapterStarted); + setState(EngineStarted); if (m_progress) m_progress->setProgressValue(25); showMessage(_("ADAPTER SUCCESSFULLY STARTED")); @@ -4286,7 +4286,7 @@ void GdbEngine::startInferiorPhase2() void GdbEngine::handleInferiorStartFailed(const QString &msg) { showStatusMessage(tr("Failed to start application: ") + msg); - if (state() == AdapterStartFailed) { + if (state() == EngineStartFailed) { showMessage(_("INFERIOR START FAILED, BUT ADAPTER DIED ALREADY")); return; // Adapter crashed meanwhile, so this notification is meaningless. } @@ -4305,7 +4305,7 @@ void GdbEngine::handleAdapterCrashed(const QString &msg) // Don't bother with state transitions - this can happen in any state and // the end result is always the same, so it makes little sense to find a // "path" which does not assert. - setState(AdapterStartFailed, true); + setState(EngineStartFailed, true); // No point in being friendly here ... gdbProc()->kill(); diff --git a/src/plugins/debugger/pdb/pdbengine.cpp b/src/plugins/debugger/pdb/pdbengine.cpp index ebf2b3b4e28125d1da6dcecb411e0f3e0efa110c..46d3ce0012eea3aec417a57007e74aa9b9538fda 100644 --- a/src/plugins/debugger/pdb/pdbengine.cpp +++ b/src/plugins/debugger/pdb/pdbengine.cpp @@ -182,7 +182,7 @@ void PdbEngine::startDebugger() if (!m_pdbProc.waitForStarted()) { const QString msg = tr("Unable to start pdb '%1': %2") .arg(m_pdb, m_pdbProc.errorString()); - setState(AdapterStartFailed); + setState(EngineStartFailed); showMessage(_("ADAPTER START FAILED")); if (!msg.isEmpty()) { const QString title = tr("Adapter start failed"); @@ -200,7 +200,7 @@ void PdbEngine::startDebugger() postCommand("execfile('" + dumperSourcePath + "pdumper.py')", CB(handleLoadDumper)); - setState(AdapterStarted); + setState(EngineStarted); setState(InferiorStarting); emit startSuccessful(); showStatusMessage(tr("Running requested..."), 5000); diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp index 18a0a71cad589904f0df5c977c41dfd305023dc6..a462a93fab79735e1feccccf2e8d95ffe6ed8a1d 100644 --- a/src/plugins/debugger/qml/qmlengine.cpp +++ b/src/plugins/debugger/qml/qmlengine.cpp @@ -255,11 +255,11 @@ void QmlEngine::startDebugger() m_proc.start(sp.executable, sp.processArgs); if (!m_proc.waitForStarted()) { - setState(AdapterStartFailed); + setState(EngineStartFailed); startFailed(); return; } - setState(AdapterStarted); + setState(EngineStarted); startSuccessful(); setState(InferiorStarting); diff --git a/src/plugins/debugger/script/scriptengine.cpp b/src/plugins/debugger/script/scriptengine.cpp index 33021f018e41ba50cace483d1304cb5693b46359..d138216dd00c7069801e5919eb644f9e64e988af 100644 --- a/src/plugins/debugger/script/scriptengine.cpp +++ b/src/plugins/debugger/script/scriptengine.cpp @@ -248,7 +248,7 @@ void ScriptEngine::startDebugger() m_stopOnNextLine = false; m_scriptEngine->abortEvaluation(); - setState(AdapterStarted); + setState(EngineStarted); setState(InferiorStarting); m_scriptFileName = QFileInfo(startParameters().executable).absoluteFilePath(); diff --git a/src/plugins/qmlinspector/qmlinspector.cpp b/src/plugins/qmlinspector/qmlinspector.cpp index e251194ea2a217d4f7e5bfba7564d981c39c445b..4c5082919279847846469feedde370a5121b7af8 100644 --- a/src/plugins/qmlinspector/qmlinspector.cpp +++ b/src/plugins/qmlinspector/qmlinspector.cpp @@ -700,7 +700,7 @@ void QmlInspector::debuggerStateChanged(int newState) m_connectionInitialized = false; break; } - case Debugger::AdapterStartFailed: + case Debugger::EngineStartFailed: case Debugger::InferiorStartFailed: emit statusMessage(QString(tr("Debugging failed: could not start C++ debugger."))); break;