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();