summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2009-10-27 09:51:14 +0100
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>2009-10-27 09:51:14 +0100
commit3fd1e5b23fd3917681f98e6b30e5b9c51f37a7e7 (patch)
tree48496e9a39f8d0e3ac810fd949f549ea6e5bc8e9
parentf244008a0fc9e6f59b57c9408939baf388a2a15f (diff)
downloadqt-creator-3fd1e5b23fd3917681f98e6b30e5b9c51f37a7e7.tar.gz
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.
-rw-r--r--share/qtcreator/gdbmacros/gdbmacros.cpp11
-rw-r--r--share/qtcreator/gdbmacros/test/main.cpp22
-rw-r--r--src/plugins/debugger/debuggerplugin.cpp1
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp2
4 files changed, 33 insertions, 3 deletions
diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index ae677bcdb6..648c79e95d 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 60e0989294..de8fc9f91f 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 9dca44cb33..a305eb278c 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 59ed22c04d..8b1e3b2c38 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;
}