forked from qt-creator/qt-creator
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:
@@ -3590,10 +3590,16 @@ static void handleProtocolVersion2and3(QDumper &d)
|
|||||||
break;
|
break;
|
||||||
case 'V':
|
case 'V':
|
||||||
#ifndef QT_BOOTSTRAPPED
|
#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);
|
qDumpQVariant(d);
|
||||||
else if (isEqual(type, "QVector"))
|
} else if (isEqual(type, "QVector")) {
|
||||||
qDumpQVector(d);
|
qDumpQVector(d);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case 'W':
|
case 'W':
|
||||||
@@ -3801,6 +3807,7 @@ void *qDumpObjectData440(
|
|||||||
"\""NS"QStringList\","
|
"\""NS"QStringList\","
|
||||||
"\""NS"QTextCodec\","
|
"\""NS"QTextCodec\","
|
||||||
"\""NS"QVariant\","
|
"\""NS"QVariant\","
|
||||||
|
"\""NS"QVariantList\","
|
||||||
"\""NS"QVector\","
|
"\""NS"QVector\","
|
||||||
#if QT_VERSION >= 0x040500
|
#if QT_VERSION >= 0x040500
|
||||||
"\""NS"QMultiMap\","
|
"\""NS"QMultiMap\","
|
||||||
|
|||||||
@@ -280,6 +280,27 @@ static int dumpQVariant()
|
|||||||
return 0;
|
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
|
// --------------- std types
|
||||||
|
|
||||||
static int dumpStdString()
|
static int dumpStdString()
|
||||||
@@ -548,6 +569,7 @@ static TypeDumpFunctionMap registerTypes()
|
|||||||
rc.insert("QObject", dumpQObject);
|
rc.insert("QObject", dumpQObject);
|
||||||
rc.insert("QObjectList", dumpQObjectList);
|
rc.insert("QObjectList", dumpQObjectList);
|
||||||
rc.insert("QVariant", dumpQVariant);
|
rc.insert("QVariant", dumpQVariant);
|
||||||
|
rc.insert("QVariantList", dumpQVariantList);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -256,6 +256,7 @@ bool DebuggerListener::coreAboutToClose()
|
|||||||
if (answer == QMessageBox::No)
|
if (answer == QMessageBox::No)
|
||||||
return false;
|
return false;
|
||||||
mgr->exitDebugger();
|
mgr->exitDebugger();
|
||||||
|
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -225,7 +225,7 @@ QMainWindow *GdbEngine::mainWindow() const
|
|||||||
GdbEngine::~GdbEngine()
|
GdbEngine::~GdbEngine()
|
||||||
{
|
{
|
||||||
// prevent sending error messages afterwards
|
// prevent sending error messages afterwards
|
||||||
disconnect(&m_gdbProc);
|
disconnect(&m_gdbProc, 0, this, 0);
|
||||||
delete m_gdbAdapter;
|
delete m_gdbAdapter;
|
||||||
m_gdbAdapter = 0;
|
m_gdbAdapter = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user