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