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.
This commit is contained in:
Friedemann Kleint
2009-10-27 09:51:14 +01:00
parent f244008a0f
commit 3fd1e5b23f
4 changed files with 33 additions and 3 deletions

View File

@@ -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\","

View File

@@ -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;
}

View File

@@ -256,6 +256,7 @@ bool DebuggerListener::coreAboutToClose()
if (answer == QMessageBox::No)
return false;
mgr->exitDebugger();
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
return true;
}

View File

@@ -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;
}