diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 8e286a8ac6215cfa48dca46904e55a956dc719d9..c8379eeb04860674c56030eb44536517b3ac9b61 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -186,7 +186,7 @@ private: bool CommandHandler::setData(const QModelIndex &, const QVariant &value, int role) { - QTC_ASSERT(m_engine, return false); + QTC_ASSERT(m_engine, qDebug() << value << role; return false); m_engine->handleCommand(role, value); return true; } diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index 51dbfe36246f6081cbb6ec0ec9af33c9d6067063..3249ece97a429ac1c088f5155d6bd92259d1c749 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -251,7 +251,7 @@ public slots: void startSuccessful(); void startFailed(); void raiseApplication(); - void quitDebugger() { exitDebugger(); } + virtual void quitDebugger() { exitDebugger(); } // called by DebuggerRunControl protected: void setState(DebuggerState state, bool forced = false); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index ae212ff8b44de9b4e1bec721c4193537946f7995..68c3db55c9504ca996826abfc8797d1c5b56e971 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -510,7 +510,7 @@ void DebuggerRunControl::stop() { m_running = false; QTC_ASSERT(m_engine, return); - m_engine->exitDebugger(); + m_engine->quitDebugger(); } void DebuggerRunControl::debuggingFinished() diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 4bd65d1af109f2d6209bdaba356e3633da65df2b..47dffc80f4617aa58180061189b72ef107990a9c 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1620,7 +1620,8 @@ QString GdbEngine::cleanupFullName(const QString &fileName) void GdbEngine::shutdown() { - showMessage(_("INITIATE GDBENGINE SHUTDOWN")); + showMessage(_("INITIATE GDBENGINE SHUTDOWN IN STATE %1, PROC: %2") + .arg(state()).arg(gdbProc()->state())); if (m_progress) { m_progress->setProgressValue(90); m_progress->reportCanceled(); @@ -1726,7 +1727,19 @@ void GdbEngine::exitDebugger() { disconnectDebuggingHelperActions(); shutdown(); - //gdbProc()->kill(); +} + +void GdbEngine::quitDebugger() +{ + // FIXME: The problem here is that the "kill" send in the shutdown() + // procedure might not receive a response anymore. So we need a way + // to force it down. On the other hand, there could be an answer, + // and regular the inferior shutdown procedure could take a while. + // And the RunControl::stop() is called synchroneously. + disconnectDebuggingHelperActions(); + shutdown(); + initializeVariables(); + setState(DebuggerNotReady); } int GdbEngine::currentFrame() const diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 43e847815d5e210ce149ec9c2844084472f35901..9d22e979406e4a320a3065f80c78122692312170 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -108,6 +108,7 @@ private: ////////// General Interface ////////// virtual void startDebugger(); virtual unsigned debuggerCapabilities() const; virtual void exitDebugger(); + virtual void quitDebugger(); virtual void detachDebugger(); virtual void shutdown();