From 3fd1e5b23fd3917681f98e6b30e5b9c51f37a7e7 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Tue, 27 Oct 2009 09:51:14 +0100
Subject: [PATCH] Debugger: Fix exit crash, dump QVariantList with gdb

Handle QVariantList within dumpers, as gdb does not resolve
typedefs. Disconnect the gdb process on exit, one more round
of event loop when quitting.
---
 share/qtcreator/gdbmacros/gdbmacros.cpp | 11 +++++++++--
 share/qtcreator/gdbmacros/test/main.cpp | 22 ++++++++++++++++++++++
 src/plugins/debugger/debuggerplugin.cpp |  1 +
 src/plugins/debugger/gdb/gdbengine.cpp  |  2 +-
 4 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index ae677bcdb69..648c79e95d3 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -3590,10 +3590,16 @@ static void handleProtocolVersion2and3(QDumper &d)
             break;
         case 'V':
             #ifndef QT_BOOTSTRAPPED
-            if (isEqual(type, "QVariant"))
+            if (isEqual(type, "QVariantList")) { // resolve typedef
+                d.outerType = "QList";
+                d.innerType = "QVariant";
+                d.extraInt[0] = sizeof(QVariant);
+                qDumpQList(d);
+            } else if (isEqual(type, "QVariant")) {
                 qDumpQVariant(d);
-            else if (isEqual(type, "QVector"))
+            } else if (isEqual(type, "QVector")) {
                 qDumpQVector(d);
+            }
             #endif
             break;
         case 'W':
@@ -3801,6 +3807,7 @@ void *qDumpObjectData440(
             "\""NS"QStringList\","
             "\""NS"QTextCodec\","
             "\""NS"QVariant\","
+            "\""NS"QVariantList\","
             "\""NS"QVector\","
 #if QT_VERSION >= 0x040500
             "\""NS"QMultiMap\","
diff --git a/share/qtcreator/gdbmacros/test/main.cpp b/share/qtcreator/gdbmacros/test/main.cpp
index 60e0989294b..de8fc9f91f2 100644
--- a/share/qtcreator/gdbmacros/test/main.cpp
+++ b/share/qtcreator/gdbmacros/test/main.cpp
@@ -280,6 +280,27 @@ static int dumpQVariant()
     return 0;
 }
 
+static int dumpQVariantList()
+{
+    QVariantList test;
+    if (!optEmptyContainers) {
+        test.push_back(QVariant(QLatin1String("hallo")));
+        test.push_back(QVariant(42));
+        test.push_back(QVariant(3.141));
+    }
+    // As a list
+    prepareInBuffer("QList", "local.qvariantlist", "local.qvariantlist", "QVariant");
+    qDumpObjectData440(2, 42, testAddress(&test), 1, sizeof(QVariant), 0,0 ,0);
+    fputs(qDumpOutBuffer, stdout);
+    // As typedef
+    fputs("\n\n", stdout);
+    prepareInBuffer("QVariantList", "local.qvariantlist", "local.qvariantlist", "");
+    qDumpObjectData440(2, 42, testAddress(&test), 1, 0, 0,0 ,0);
+    fputs(qDumpOutBuffer, stdout);
+    fputc('\n', stdout);
+    return 0;
+}
+
 // ---------------  std types
 
 static int dumpStdString()
@@ -548,6 +569,7 @@ static TypeDumpFunctionMap registerTypes()
     rc.insert("QObject", dumpQObject);
     rc.insert("QObjectList", dumpQObjectList);
     rc.insert("QVariant", dumpQVariant);
+    rc.insert("QVariantList", dumpQVariantList);
     return rc;
 }
 
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 9dca44cb337..a305eb278c6 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -256,6 +256,7 @@ bool DebuggerListener::coreAboutToClose()
     if (answer == QMessageBox::No)
         return false;
     mgr->exitDebugger();
+    QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
     return true;
 }
 
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 59ed22c04d5..8b1e3b2c380 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -225,7 +225,7 @@ QMainWindow *GdbEngine::mainWindow() const
 GdbEngine::~GdbEngine()
 {
     // prevent sending error messages afterwards
-    disconnect(&m_gdbProc);
+    disconnect(&m_gdbProc, 0, this, 0);
     delete m_gdbAdapter;
     m_gdbAdapter = 0;
 }
-- 
GitLab