diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index fa3d7ffa2a7871cdaaa8e28eaa433f28c52de593..8c3eb12c5f72b61f4107488ee9d28ec6a35cda4d 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -269,38 +269,41 @@ public: virtual void quitDebugger(); // called by DebuggerRunControl protected: - void notifyEngineSetupOk(); - void notifyEngineSetupFailed(); - void notifyEngineRunFailed(); + // The base notify*() function implementation should be sufficient + // in most cases, but engines are free to override them to do some + // engine specific cleanup like stopping timers etc. + virtual void notifyEngineSetupOk(); + virtual void notifyEngineSetupFailed(); + virtual void notifyEngineRunFailed(); - void notifyInferiorSetupOk(); - void notifyInferiorSetupFailed(); + virtual void notifyInferiorSetupOk(); + virtual void notifyInferiorSetupFailed(); - void notifyEngineRunAndInferiorRunOk(); - void notifyEngineRunAndInferiorStopOk(); - void notifyInferiorUnrunnable(); // Called by CoreAdapter. + virtual void notifyEngineRunAndInferiorRunOk(); + virtual void notifyEngineRunAndInferiorStopOk(); + virtual void notifyInferiorUnrunnable(); // Called by CoreAdapter. // Use notifyInferiorRunRequested() plus notifyInferiorRunOk() instead. - //void notifyInferiorSpontaneousRun(); + //virtual void notifyInferiorSpontaneousRun(); - void notifyInferiorRunRequested(); - void notifyInferiorRunOk(); - void notifyInferiorRunFailed(); + virtual void notifyInferiorRunRequested(); + virtual void notifyInferiorRunOk(); + virtual void notifyInferiorRunFailed(); - void notifyInferiorStopOk(); - void notifyInferiorSpontaneousStop(); - void notifyInferiorStopFailed(); - void notifyInferiorExited(); + virtual void notifyInferiorStopOk(); + virtual void notifyInferiorSpontaneousStop(); + virtual void notifyInferiorStopFailed(); + virtual void notifyInferiorExited(); - void notifyInferiorShutdownOk(); - void notifyInferiorShutdownFailed(); + virtual void notifyInferiorShutdownOk(); + virtual void notifyInferiorShutdownFailed(); - void notifyEngineSpontaneousShutdown(); - void notifyEngineShutdownOk(); - void notifyEngineShutdownFailed(); + virtual void notifyEngineSpontaneousShutdown(); + virtual void notifyEngineShutdownOk(); + virtual void notifyEngineShutdownFailed(); - void notifyInferiorIll(); - void notifyEngineIll(); + virtual void notifyInferiorIll(); + virtual void notifyEngineIll(); virtual void setupEngine() = 0; virtual void setupInferior() = 0; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index a5b9da7f82e2b6f4912ea6fc5b69457cb8b4d605..69179d64932ed603efb8fa8d8069380f44574401 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4190,6 +4190,14 @@ void GdbEngine::setupInferior() m_gdbAdapter->setupInferior(); } +void GdbEngine::notifyInferiorSetupFailed() +{ + // FIXME: that's not enough to stop gdb from getting confused + // by a timeout of the adapter. + //resetCommandQueue(); + DebuggerEngine::notifyInferiorSetupFailed(); +} + void GdbEngine::handleInferiorPrepared() { QTC_ASSERT(state() == InferiorSetupRequested, qDebug() << state()); @@ -4289,6 +4297,19 @@ void GdbEngine::handleCreateFullBacktrace(const GdbResponse &response) } } +void GdbEngine::resetCommandQueue() +{ + m_commandTimer->stop(); + if (!m_cookieForToken.isEmpty()) { + QString msg; + QTextStream ts(&msg); + ts << "RESETING COMMAND QUEUE. LEFT OVER TOKENS: "; + foreach (const GdbCommand &cookie, m_cookieForToken) + ts << "CMD:" << cookie.command << cookie.callbackName; + m_cookieForToken.clear(); + showMessage(msg); + } +} // // Factory diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 3cf89306b2c830f6bcacb330771f1f1c845065ab..db257fcf78d72f8d6bb3d947ad1ad8fcf307e765 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -113,6 +113,7 @@ private: ////////// General Interface ////////// virtual void detachDebugger(); virtual void shutdownEngine(); virtual void shutdownInferior(); + virtual void notifyInferiorSetupFailed(); virtual void executeDebuggerCommand(const QString &command); virtual QString qtNamespace() const { return m_dumperHelper.qtNamespace(); } @@ -287,6 +288,7 @@ private: ////////// Gdb Output, State & Capability Handling ////////// void handleStop1(const GdbResponse &response); void handleStop1(const GdbMi &data); StackFrame parseStackFrame(const GdbMi &mi, int level); + void resetCommandQueue(); bool isSynchroneous() const { return hasPython(); } virtual bool hasPython() const;