forked from qt-creator/qt-creator
Debugger: Add LLDB to dumper test infrastructure
Not working yet. Change-Id: I87bd15d8c4aee491404b57842884220103a63e1f Reviewed-by: hjk <hjk121@nokiamail.com>
This commit is contained in:
@@ -45,6 +45,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace Debugger;
|
using namespace Debugger;
|
||||||
|
using namespace Utils;
|
||||||
using namespace Internal;
|
using namespace Internal;
|
||||||
|
|
||||||
static QByteArray noValue = "\001";
|
static QByteArray noValue = "\001";
|
||||||
@@ -358,9 +359,11 @@ struct TempStuff
|
|||||||
QString buildPath;
|
QString buildPath;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DebuggerEngine {
|
enum DebuggerEngine
|
||||||
gdbEngine,
|
{
|
||||||
cdbEngine
|
GdbEngine,
|
||||||
|
CdbEngine,
|
||||||
|
LldbEngine
|
||||||
};
|
};
|
||||||
|
|
||||||
Q_DECLARE_METATYPE(Data)
|
Q_DECLARE_METATYPE(Data)
|
||||||
@@ -370,7 +373,16 @@ class tst_Dumpers : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
tst_Dumpers() : t(0), m_keepTemp(false) {}
|
tst_Dumpers()
|
||||||
|
{
|
||||||
|
t = 0;
|
||||||
|
m_keepTemp = false;
|
||||||
|
m_gdbVersion = 0;
|
||||||
|
m_gdbBuildVersion = 0;
|
||||||
|
m_lldbVersion = 0;
|
||||||
|
m_isMacGdb = false;
|
||||||
|
m_isQnxGdb = false;
|
||||||
|
}
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void initTestCase();
|
void initTestCase();
|
||||||
@@ -389,6 +401,7 @@ private:
|
|||||||
bool m_keepTemp;
|
bool m_keepTemp;
|
||||||
int m_gdbVersion; // 7.5.1 -> 70501
|
int m_gdbVersion; // 7.5.1 -> 70501
|
||||||
int m_gdbBuildVersion;
|
int m_gdbBuildVersion;
|
||||||
|
int m_lldbVersion;
|
||||||
bool m_isMacGdb;
|
bool m_isMacGdb;
|
||||||
bool m_isQnxGdb;
|
bool m_isQnxGdb;
|
||||||
};
|
};
|
||||||
@@ -398,16 +411,21 @@ void tst_Dumpers::initTestCase()
|
|||||||
m_debuggerBinary = qgetenv("QTC_DEBUGGER_PATH");
|
m_debuggerBinary = qgetenv("QTC_DEBUGGER_PATH");
|
||||||
if (m_debuggerBinary.isEmpty())
|
if (m_debuggerBinary.isEmpty())
|
||||||
m_debuggerBinary = "gdb";
|
m_debuggerBinary = "gdb";
|
||||||
m_debuggerEngine = m_debuggerBinary.endsWith("cdb.exe") ? cdbEngine : gdbEngine;
|
|
||||||
|
m_debuggerEngine = GdbEngine;
|
||||||
|
if (m_debuggerBinary.endsWith("cdb.exe"))
|
||||||
|
m_debuggerEngine = CdbEngine;
|
||||||
|
if (m_debuggerBinary.endsWith("lldb") || m_debuggerBinary.contains("/lldb-"))
|
||||||
|
m_debuggerEngine = LldbEngine;
|
||||||
|
|
||||||
m_qmakeBinary = qgetenv("QTC_QMAKE_PATH");
|
m_qmakeBinary = qgetenv("QTC_QMAKE_PATH");
|
||||||
if (m_qmakeBinary.isEmpty())
|
if (m_qmakeBinary.isEmpty())
|
||||||
m_qmakeBinary = "qmake";
|
m_qmakeBinary = "qmake";
|
||||||
|
|
||||||
Utils::Environment utilsEnv = Utils::Environment::systemEnvironment();
|
Environment utilsEnv = Environment::systemEnvironment();
|
||||||
utilsEnv.appendOrSet(QLatin1String("QT_HASH_SEED"), QLatin1String("0"));
|
utilsEnv.appendOrSet(QLatin1String("QT_HASH_SEED"), QLatin1String("0"));
|
||||||
|
|
||||||
if (m_debuggerEngine == gdbEngine) {
|
if (m_debuggerEngine == GdbEngine) {
|
||||||
QProcess debugger;
|
QProcess debugger;
|
||||||
debugger.start(QString::fromLatin1(m_debuggerBinary)
|
debugger.start(QString::fromLatin1(m_debuggerBinary)
|
||||||
+ QLatin1String(" -i mi -quiet -nx"));
|
+ QLatin1String(" -i mi -quiet -nx"));
|
||||||
@@ -428,14 +446,14 @@ void tst_Dumpers::initTestCase()
|
|||||||
QVERIFY(pos2 != -1);
|
QVERIFY(pos2 != -1);
|
||||||
pos2 -= 4;
|
pos2 -= 4;
|
||||||
version = version.mid(pos1, pos2 - pos1);
|
version = version.mid(pos1, pos2 - pos1);
|
||||||
Debugger::Internal::extractGdbVersion(version, &m_gdbVersion,
|
extractGdbVersion(version, &m_gdbVersion,
|
||||||
&m_gdbBuildVersion, &m_isMacGdb, &m_isQnxGdb);
|
&m_gdbBuildVersion, &m_isMacGdb, &m_isQnxGdb);
|
||||||
qDebug() << "Gdb version " << m_gdbVersion;
|
qDebug() << "Gdb version " << m_gdbVersion;
|
||||||
} else {
|
} else if (m_debuggerEngine == CdbEngine) {
|
||||||
QByteArray envBat = qgetenv("QTC_MSVC_ENV_BAT");
|
QByteArray envBat = qgetenv("QTC_MSVC_ENV_BAT");
|
||||||
QMap <QString, QString> envPairs;
|
QMap <QString, QString> envPairs;
|
||||||
QVERIFY(ProjectExplorer::Internal::AbstractMsvcToolChain::generateEnvironmentSettings(
|
QVERIFY(ProjectExplorer::Internal::AbstractMsvcToolChain::generateEnvironmentSettings(
|
||||||
utilsEnv, QString::fromLatin1(envBat), QLatin1String(""), envPairs));
|
utilsEnv, QString::fromLatin1(envBat), QString(), envPairs));
|
||||||
|
|
||||||
for (QMap<QString,QString>::const_iterator envIt = envPairs.begin(); envIt!=envPairs.end(); ++envIt)
|
for (QMap<QString,QString>::const_iterator envIt = envPairs.begin(); envIt!=envPairs.end(); ++envIt)
|
||||||
utilsEnv.set(envIt.key(), envIt.value());
|
utilsEnv.set(envIt.key(), envIt.value());
|
||||||
@@ -446,6 +464,19 @@ void tst_Dumpers::initTestCase()
|
|||||||
utilsEnv.appendOrSet(QLatin1String("_NT_DEBUGGER_EXTENSION_PATH"),
|
utilsEnv.appendOrSet(QLatin1String("_NT_DEBUGGER_EXTENSION_PATH"),
|
||||||
QString::fromLatin1(cdbextPath),
|
QString::fromLatin1(cdbextPath),
|
||||||
QLatin1String(";"));
|
QLatin1String(";"));
|
||||||
|
} else if (m_debuggerEngine == LldbEngine) {
|
||||||
|
m_usePython = true;
|
||||||
|
QProcess debugger;
|
||||||
|
debugger.start(QString::fromLatin1(m_debuggerBinary + " -v"));
|
||||||
|
bool ok = debugger.waitForFinished(2000);
|
||||||
|
QVERIFY(ok);
|
||||||
|
QByteArray output = debugger.readAllStandardOutput();
|
||||||
|
output += debugger.readAllStandardError();
|
||||||
|
output = output.trimmed();
|
||||||
|
// Should be something like LLDB-178
|
||||||
|
m_lldbVersion = output.mid(5).toInt();
|
||||||
|
qDebug() << "Lldb version " << output << m_lldbVersion;
|
||||||
|
QVERIFY(m_lldbVersion);
|
||||||
}
|
}
|
||||||
m_env = utilsEnv.toProcessEnvironment();
|
m_env = utilsEnv.toProcessEnvironment();
|
||||||
}
|
}
|
||||||
@@ -469,7 +500,7 @@ void tst_Dumpers::dumper()
|
|||||||
{
|
{
|
||||||
QFETCH(Data, data);
|
QFETCH(Data, data);
|
||||||
|
|
||||||
if (m_debuggerEngine == gdbEngine) {
|
if (m_debuggerEngine == GdbEngine) {
|
||||||
if (data.neededGdbVersion.min > m_gdbVersion)
|
if (data.neededGdbVersion.min > m_gdbVersion)
|
||||||
MSKIP_SINGLE("Need minimum GDB version " + QByteArray::number(data.neededGdbVersion.min));
|
MSKIP_SINGLE("Need minimum GDB version " + QByteArray::number(data.neededGdbVersion.min));
|
||||||
if (data.neededGdbVersion.max < m_gdbVersion)
|
if (data.neededGdbVersion.max < m_gdbVersion)
|
||||||
@@ -526,7 +557,7 @@ void tst_Dumpers::dumper()
|
|||||||
|
|
||||||
QProcess make;
|
QProcess make;
|
||||||
make.setWorkingDirectory(t->buildPath);
|
make.setWorkingDirectory(t->buildPath);
|
||||||
cmd = m_debuggerEngine == gdbEngine ? QString::fromLatin1("make")
|
cmd = m_debuggerEngine == GdbEngine ? QString::fromLatin1("make")
|
||||||
: QString::fromLatin1("nmake");
|
: QString::fromLatin1("nmake");
|
||||||
//qDebug() << "Starting make: " << cmd;
|
//qDebug() << "Starting make: " << cmd;
|
||||||
make.start(cmd);
|
make.start(cmd);
|
||||||
@@ -566,7 +597,7 @@ void tst_Dumpers::dumper()
|
|||||||
QByteArray cmds;
|
QByteArray cmds;
|
||||||
QStringList args;
|
QStringList args;
|
||||||
|
|
||||||
if (m_debuggerEngine == gdbEngine) {
|
if (m_debuggerEngine == GdbEngine) {
|
||||||
args << QLatin1String("-i")
|
args << QLatin1String("-i")
|
||||||
<< QLatin1String("mi")
|
<< QLatin1String("mi")
|
||||||
<< QLatin1String("-quiet")
|
<< QLatin1String("-quiet")
|
||||||
@@ -600,7 +631,7 @@ void tst_Dumpers::dumper()
|
|||||||
}
|
}
|
||||||
cmds += "quit\n";
|
cmds += "quit\n";
|
||||||
|
|
||||||
} else {
|
} else if (m_debuggerEngine == CdbEngine) {
|
||||||
args << QLatin1String("-aqtcreatorcdbext.dll")
|
args << QLatin1String("-aqtcreatorcdbext.dll")
|
||||||
<< QLatin1String("-lines")
|
<< QLatin1String("-lines")
|
||||||
<< QLatin1String("-G")
|
<< QLatin1String("-G")
|
||||||
@@ -615,6 +646,16 @@ void tst_Dumpers::dumper()
|
|||||||
"gu\n"
|
"gu\n"
|
||||||
"!qtcreatorcdbext.locals -t 2 -D -e " + expanded + ",return,watch,inspect -v -c -W 0\n"
|
"!qtcreatorcdbext.locals -t 2 -D -e " + expanded + ",return,watch,inspect -v -c -W 0\n"
|
||||||
"q\n";
|
"q\n";
|
||||||
|
} else if (m_debuggerEngine == LldbEngine) {
|
||||||
|
cmds = "script execfile('" + dumperDir + "/bridge.py')\n"
|
||||||
|
"script execfile('" + dumperDir + "/dumper.py')\n"
|
||||||
|
"script execfile('" + dumperDir + "/qttypes.py')\n"
|
||||||
|
"bbsetup\n"
|
||||||
|
"run\n"
|
||||||
|
"up\n"
|
||||||
|
"script print('@%sS@%s@' % ('N', qtNamespace()))\n"
|
||||||
|
"script bb('options:fancy,autoderef,dyntype vars: expanded:" + expanded + " typeformats:')\n"
|
||||||
|
"quit\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
t->input = cmds;
|
t->input = cmds;
|
||||||
@@ -642,7 +683,7 @@ void tst_Dumpers::dumper()
|
|||||||
|
|
||||||
Context context;
|
Context context;
|
||||||
QByteArray contents;
|
QByteArray contents;
|
||||||
if (m_debuggerEngine == gdbEngine) {
|
if (m_debuggerEngine == GdbEngine) {
|
||||||
int posDataStart = output.indexOf("data=");
|
int posDataStart = output.indexOf("data=");
|
||||||
QVERIFY(posDataStart != -1);
|
QVERIFY(posDataStart != -1);
|
||||||
int posDataEnd = output.indexOf(",typeinfo", posDataStart);
|
int posDataEnd = output.indexOf(",typeinfo", posDataStart);
|
||||||
|
Reference in New Issue
Block a user