From ad9ff8ed74d149cbb86c226933b9492b8adc819e Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 24 Aug 2010 16:22:21 +0200
Subject: [PATCH] Debugger: Fix exit crash.

Make sure DebuggerRunner::finished() is always connected to
handleFinished() (even for subclassed DebuggerRunners). Add
some more debugging information.
---
 src/plugins/debugger/debuggerengine.cpp | 45 ++++++++++++++++++++-----
 src/plugins/debugger/debuggerplugin.cpp |  5 ++-
 src/plugins/debugger/debuggerrunner.cpp | 19 +++++------
 3 files changed, 46 insertions(+), 23 deletions(-)

diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 24609f446a2..1cfd45bf4c7 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -612,47 +612,74 @@ SourceFilesHandler *DebuggerEngine::sourceFilesHandler() const
 
 QAbstractItemModel *DebuggerEngine::modulesModel() const
 {
-    return d->m_modulesHandler.model();
+    QAbstractItemModel *model = d->m_modulesHandler.model();
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("ModulesModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::breakModel() const
 {
-    return d->m_breakHandler.model();
+    QAbstractItemModel *model = d->m_breakHandler.model();
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("BreakModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::registerModel() const
 {
-    return d->m_registerHandler.model();
+    QAbstractItemModel *model = d->m_registerHandler.model();
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("RegisterModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::stackModel() const
 {
-    return d->m_stackHandler.model();
+    QAbstractItemModel *model = d->m_stackHandler.model();
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("StackModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::threadsModel() const
 {
-    return d->m_threadsHandler.model();
+    QAbstractItemModel *model = d->m_threadsHandler.model();
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("ThreadsModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::localsModel() const
 {
-    return d->m_watchHandler.model(LocalsWatch);
+    QAbstractItemModel *model = d->m_watchHandler.model(LocalsWatch);
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("LocalsModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::watchersModel() const
 {
-    return d->m_watchHandler.model(WatchersWatch);
+    QAbstractItemModel *model = d->m_watchHandler.model(WatchersWatch);
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("WatchersModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::returnModel() const
 {
-    return d->m_watchHandler.model(ReturnWatch);
+    QAbstractItemModel *model = d->m_watchHandler.model(ReturnWatch);
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("ReturnModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::sourceFilesModel() const
 {
-    return d->m_sourceFilesHandler.model();
+    QAbstractItemModel *model = d->m_sourceFilesHandler.model();
+    if (model->objectName().isEmpty()) // Make debugging easier.
+        model->setObjectName(objectName() + QLatin1String("SourceFilesModel"));
+    return model;
 }
 
 QAbstractItemModel *DebuggerEngine::commandModel() const
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index eeea0e44e9f..1d381ee8fa3 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -2171,15 +2171,14 @@ void DebuggerPluginPrivate::setInitialState()
 
 void DebuggerPluginPrivate::updateState(DebuggerEngine *engine)
 {
-    //m_threadBox->setModel(engine->threadsModel());
-    //m_threadBox->setModel(engine->threadsModel());
+    QTC_ASSERT(engine != 0 && m_watchersWindow->model() != 0 && m_returnWindow->model() != 0, return);
     m_threadBox->setCurrentIndex(engine->threadsHandler()->currentThread());
+
     m_watchersWindow->setVisible(
         m_watchersWindow->model()->rowCount(QModelIndex()) > 0);
     m_returnWindow->setVisible(
         m_returnWindow->model()->rowCount(QModelIndex()) > 0);
 
-    QTC_ASSERT(engine, return);
     if (m_state == engine->state())
         return;
 
diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp
index 7452fa91e21..7bd3107bfde 100644
--- a/src/plugins/debugger/debuggerrunner.cpp
+++ b/src/plugins/debugger/debuggerrunner.cpp
@@ -189,7 +189,6 @@ DebuggerRunControl *DebuggerRunControlFactory::create(
         delete runControl;
         return 0;
     }
-    connect(runControl, SIGNAL(finished()), runControl, SLOT(handleFinished()));
     return runControl;
 }
 
@@ -209,13 +208,14 @@ QWidget *DebuggerRunControlFactory::createConfigurationWidget
 ////////////////////////////////////////////////////////////////////////
 
 DebuggerRunControl::DebuggerRunControl(RunConfiguration *runConfiguration,
-        DebuggerEngineType enabledEngines, const DebuggerStartParameters &sp)
-    : RunControl(runConfiguration, ProjectExplorer::Constants::DEBUGMODE),
-      m_myRunConfiguration(runConfiguration)
+        DebuggerEngineType enabledEngines, const DebuggerStartParameters &sp) :
+    RunControl(runConfiguration, ProjectExplorer::Constants::DEBUGMODE),
+    m_engine(0),
+    m_myRunConfiguration(runConfiguration),
+    m_running(false),
+    m_enabledEngines(enabledEngines)
 {
-    m_running = false;
-    m_enabledEngines = enabledEngines;
-    m_engine = 0;
+    connect(this, SIGNAL(finished()), this, SLOT(handleFinished()));
     createEngine(sp);
 }
 
@@ -336,9 +336,6 @@ void DebuggerRunControl::createEngine(const DebuggerStartParameters &sp)
 {
     // Figure out engine according to toolchain, executable, attach or default.
     DebuggerEngineType engineType = NoEngineType;
-    QString errorMessage;
-    QString settingsIdHint;
-
     bool isQmlExecutable = sp.executable.endsWith(_("qmlviewer")) || sp.executable.endsWith(_("qmlobserver"));
 #ifdef Q_OS_MAC
     isQmlExecutable = sp.executable.endsWith(_("QMLViewer.app")) || sp.executable.endsWith(_("QMLObserver.app"));
@@ -476,9 +473,9 @@ void DebuggerRunControl::start()
     plugin()->showMessage(message, StatusBar);
     plugin()->showMessage(DebuggerSettings::instance()->dump(), LogDebug);
 
+    plugin()->runControlStarted(this);
     engine()->startDebugger(this);
     m_running = true;
-    plugin()->runControlStarted(this);
     emit started();
 }
 
-- 
GitLab