From 753a28ed4e6c47c8e926f21c994edce55e2b6cf9 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Tue, 20 Jul 2010 18:31:35 +0200 Subject: [PATCH] debugger: make debugger restartable using the buttons in the application output pane --- src/plugins/debugger/debuggerengine.cpp | 24 ++++++++++++++++++------ src/plugins/debugger/debuggerengine.h | 1 + src/plugins/debugger/debuggerrunner.cpp | 1 + 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index fa740f1e590..213f6c81dc9 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -685,8 +685,6 @@ void DebuggerEngine::startDebugger(DebuggerRunControl *runControl) d->m_runControl = runControl; - QTC_ASSERT(state() == DebuggerNotReady, qDebug() << state()); - d->m_inferiorPid = d->m_startParameters.attachPID > 0 ? d->m_startParameters.attachPID : 0; @@ -700,7 +698,10 @@ void DebuggerEngine::startDebugger(DebuggerRunControl *runControl) theDebuggerAction(OperateByInstruction) ->setEnabled(engineCapabilities & DisassemblerCapability); + QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished, + qDebug() << state()); setState(EngineSetupRequested); + setupEngine(); } @@ -869,9 +870,16 @@ void DebuggerEngine::addToWatchWindow() watchHandler()->watchExpression(exp); } +// Called from RunControl. +void DebuggerEngine::handleStartFailed() +{ + d->m_runControl = 0; +} + // Called from RunControl. void DebuggerEngine::handleFinished() { + d->m_runControl = 0; modulesHandler()->removeAll(); stackHandler()->removeAll(); threadsHandler()->removeAll(); @@ -983,7 +991,7 @@ static bool isAllowedTransition(DebuggerState from, DebuggerState to) case EngineSetupRequested: return to == EngineSetupOk || to == EngineSetupFailed; case EngineSetupFailed: - // FIXME: In therory it's the engine's task to go into a + // FIXME: In therory it's the engine's task to go into a // proper "Shutdown" state before calling notifyEngineSetupFailed //return to == DebuggerFinished; return to == EngineShutdownRequested; @@ -1034,7 +1042,7 @@ static bool isAllowedTransition(DebuggerState from, DebuggerState to) return to == DebuggerFinished; case DebuggerFinished: - return false; + return to == EngineSetupRequested; // Happens on restart. } qDebug() << "UNKNOWN STATE:" << from; @@ -1046,7 +1054,9 @@ void DebuggerEngine::notifyEngineSetupFailed() showMessage(_("NOTE: ENGINE SETUP FAILED")); QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); setState(EngineSetupFailed); - d->m_runControl->startFailed(); + QTC_ASSERT(d->m_runControl, /**/); + if (d->m_runControl) + d->m_runControl->startFailed(); d->queueShutdownEngine(); } @@ -1055,7 +1065,9 @@ void DebuggerEngine::notifyEngineSetupOk() showMessage(_("NOTE: ENGINE SETUP OK")); QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); setState(EngineSetupOk); - d->m_runControl->startSuccessful(); + QTC_ASSERT(d->m_runControl, /**/); + if (d->m_runControl) + d->m_runControl->startSuccessful(); showMessage(_("QUEUE: SETUP INFERIOR")); QTimer::singleShot(0, d, SLOT(doSetupInferior())); } diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 1d4845b1692..6cd9fb8796c 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -213,6 +213,7 @@ public: QAbstractItemModel *sourceFilesModel() const; void handleFinished(); + void handleStartFailed(); bool debuggerActionsEnabled() const; static bool debuggerActionsEnabled(DebuggerState state); void showModuleSymbols(const QString &moduleName, const Symbols &symbols); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 182eff9c2df..fb49cba4f8d 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -470,6 +470,7 @@ void DebuggerRunControl::startFailed() { m_running = false; emit finished(); + engine()->handleStartFailed(); } void DebuggerRunControl::handleStarted() -- GitLab