File indexing completed on 2024-05-12 04:39:58
0001 /* 0002 SPDX-FileCopyrightText: 2010 Niko Sams <niko.sams@gmail.com> 0003 0004 SPDX-License-Identifier: LGPL-2.0-only 0005 */ 0006 0007 #include "test_gdbprinters.h" 0008 0009 #include "tests/debuggers-tests-config.h" 0010 0011 #include <QCoreApplication> 0012 #include <QTest> 0013 #include <QProcess> 0014 #include <QDebug> 0015 #include <QFileInfo> 0016 #include <QDir> 0017 #include <QStandardPaths> 0018 0019 const QString BINARY_PATH(DEBUGGEE_BIN_DIR); 0020 0021 class GdbProcess : private QProcess 0022 { 0023 Q_OBJECT 0024 0025 public: 0026 explicit GdbProcess(const QString &program) : QProcess() 0027 { 0028 setProcessChannelMode(MergedChannels); 0029 // don't attempt to load .gdbinit in home (may cause unexpected results) 0030 QProcess::start(QStringLiteral("gdb"), (QStringList() << QStringLiteral("-nx") << (BINARY_PATH + '/' + program))); 0031 const bool started = waitForStarted(); 0032 if (!started) { 0033 qDebug() << "Failed to start 'gdb' executable:" << errorString(); 0034 Q_ASSERT(false); 0035 return; 0036 } 0037 0038 QByteArray prompt = waitForPrompt(); 0039 QVERIFY(!prompt.contains("No such file or directory")); 0040 execute("set confirm off"); 0041 execute("set print pretty on"); 0042 execute("set disable-randomization off"); // see https://phabricator.kde.org/D2188 0043 QList<QByteArray> p; 0044 QDir printersDir = QFileInfo(__FILE__).dir(); 0045 printersDir.cdUp(); // go up to get to the main printers directory 0046 QVERIFY(printersDir.cd("printers")); 0047 p << "python" 0048 << "import sys" 0049 << "sys.path.insert(0, '"+printersDir.path().toLatin1()+"')" 0050 << "from qt import register_qt_printers" 0051 << "register_qt_printers (None)" 0052 << "from kde import register_kde_printers" 0053 << "register_kde_printers (None)" 0054 << "end"; 0055 for (const QByteArray& i : qAsConst(p)) { 0056 write(i + "\n"); 0057 } 0058 waitForPrompt(); 0059 } 0060 ~GdbProcess() override 0061 { 0062 write("q\n"); 0063 waitForFinished(); 0064 } 0065 QByteArray waitForPrompt() 0066 { 0067 QByteArray output; 0068 while (!output.endsWith("(gdb) ")) { 0069 Q_ASSERT(state() == QProcess::Running); 0070 waitForReadyRead(); 0071 QByteArray l = readAll(); 0072 //qDebug() << l; 0073 output.append(l); 0074 } 0075 output.chop(7); //remove (gdb) prompt 0076 if (output.contains("Traceback") || output.contains("Exception")) { 0077 qDebug() << output; 0078 QTest::qFail("Unexpected Python Exception", __FILE__, __LINE__); 0079 } 0080 return output; 0081 } 0082 0083 QByteArray execute(const QByteArray &cmd) 0084 { 0085 write(cmd + "\n"); 0086 auto out = waitForPrompt(); 0087 qDebug() << cmd << " = " << out; 0088 return out; 0089 } 0090 }; 0091 0092 void QtPrintersTest::initTestCase() 0093 { 0094 QStandardPaths::setTestModeEnabled(true); 0095 0096 // Prevent SIGPIPE, then "ICE default IO error handler doing an exit(), pid = <PID>, errno = 32" 0097 // crash when the test runs for at least 60 seconds. This is a workaround for QTBUG-58709. 0098 QCoreApplication::processEvents(); 0099 } 0100 0101 void QtPrintersTest::testQString() 0102 { 0103 GdbProcess gdb(QStringLiteral("debuggee_qstring")); 0104 gdb.execute("break qstring.cpp:5"); 0105 gdb.execute("run"); 0106 QVERIFY(gdb.execute("print s").contains("\"test最后一个不是特殊字符'\\\"\\\\u6211\"")); 0107 gdb.execute("next"); 0108 QVERIFY(gdb.execute("print s").contains("\"test最后一个不是特殊字符'\\\"\\\\u6211x\"")); 0109 0110 const auto isEmptyGdbString = [](const QString& str) { return str.contains("= \"\""); }; 0111 gdb.execute("next"); 0112 QVERIFY(isEmptyGdbString(gdb.execute("print nullString"))); 0113 gdb.execute("next"); 0114 QVERIFY(isEmptyGdbString(gdb.execute("print emptyString"))); 0115 } 0116 0117 void QtPrintersTest::testQByteArray() 0118 { 0119 GdbProcess gdb(QStringLiteral("debuggee_qbytearray")); 0120 gdb.execute("break qbytearray.cpp:5"); 0121 gdb.execute("run"); 0122 QByteArray out = gdb.execute("print ba"); 0123 qDebug() << out; 0124 QVERIFY(out.contains("\"\xE6\x98\xAF'\\\"\\\\u6211\"")); 0125 QVERIFY(out.contains("[0] = -26 '\\346'")); 0126 QVERIFY(out.contains("[3] = 39 '\\''")); 0127 QVERIFY(out.contains("[4] = 34 '\"'")); 0128 gdb.execute("next"); 0129 out = gdb.execute("print ba"); 0130 QVERIFY(out.contains("\"\xE6\x98\xAF'\\\"\\\\u6211x\"")); 0131 } 0132 0133 void QtPrintersTest::testQListContainer_data() 0134 { 0135 QTest::addColumn<QString>("container"); 0136 0137 QTest::newRow("QList") << "QList"; 0138 QTest::newRow("QQueue") << "QQueue"; 0139 QTest::newRow("QVector") << "QVector"; 0140 QTest::newRow("QStack") << "QStack"; 0141 QTest::newRow("QLinkedList") << "QLinkedList"; 0142 QTest::newRow("QSet") << "QSet"; 0143 } 0144 0145 void QtPrintersTest::testQListContainer() 0146 { 0147 QFETCH(QString, container); 0148 GdbProcess gdb(QStringLiteral("debuggee_qlistcontainer")); 0149 gdb.execute("break main"); 0150 gdb.execute("run"); 0151 gdb.execute(QStringLiteral("break 'doStuff<%1>()'").arg(container).toLocal8Bit()); 0152 gdb.execute("cont"); 0153 0154 auto runToLine = [&](int line) { 0155 gdb.execute("tbreak qlistcontainer.cpp:" + QByteArray::number(line)); 0156 gdb.execute("cont"); 0157 }; 0158 0159 { // <int> 0160 runToLine(34); 0161 QByteArray out = gdb.execute("print intList"); 0162 qWarning() << "FOO" << out; 0163 QVERIFY(out.contains(QString("%1<int> (size = 0)").arg(container).toLocal8Bit())); 0164 gdb.execute("next"); 0165 out = gdb.execute("print intList"); 0166 QVERIFY(out.contains(QString("%1<int> (size = 2)").arg(container).toLocal8Bit())); 0167 if (container != QLatin1String("QSet")) { 0168 QVERIFY(out.contains("[0] = 10")); 0169 QVERIFY(out.contains("[1] = 20")); 0170 QVERIFY(!out.contains("[2] = 30")); 0171 } else { // QSet order is undefined 0172 QVERIFY(out.contains("] = 10")); 0173 QVERIFY(out.contains("] = 20")); 0174 QVERIFY(!out.contains("] = 30")); 0175 } 0176 gdb.execute("next"); 0177 out = gdb.execute("print intList"); 0178 QVERIFY(out.contains(QString("%1<int> (size = 3)").arg(container).toLocal8Bit())); 0179 if (container != QLatin1String("QSet")) { 0180 QVERIFY(out.contains("[0] = 10")); 0181 QVERIFY(out.contains("[1] = 20")); 0182 QVERIFY(out.contains("[2] = 30")); 0183 } else { // QSet order is undefined 0184 QVERIFY(out.contains("] = 10")); 0185 QVERIFY(out.contains("] = 20")); 0186 QVERIFY(out.contains("] = 30")); 0187 } 0188 } 0189 { // <QString> 0190 runToLine(38); 0191 QByteArray out = gdb.execute("print stringList"); 0192 QVERIFY(out.contains(QString("%1<QString> (size = 0)").arg(container).toLocal8Bit())); 0193 gdb.execute("next"); 0194 out = gdb.execute("print stringList"); 0195 QVERIFY(out.contains(QString("%1<QString> (size = 2)").arg(container).toLocal8Bit())); 0196 if (container != QLatin1String("QSet")) { 0197 QVERIFY(out.contains("[0] = \"a\"")); 0198 QVERIFY(out.contains("[1] = \"bc\"")); 0199 QVERIFY(!out.contains("[2] = \"d\"")); 0200 } else { // QSet order is undefined 0201 QVERIFY(out.contains("] = \"a\"")); 0202 QVERIFY(out.contains("] = \"bc\"")); 0203 QVERIFY(!out.contains("] = \"d\"")); 0204 } 0205 gdb.execute("next"); 0206 out = gdb.execute("print stringList"); 0207 QVERIFY(out.contains(QString("%1<QString> (size = 3)").arg(container).toLocal8Bit())); 0208 if (container != QLatin1String("QSet")) { 0209 QVERIFY(out.contains("[0] = \"a\"")); 0210 QVERIFY(out.contains("[1] = \"bc\"")); 0211 QVERIFY(out.contains("[2] = \"d\"")); 0212 } else { // QSet order is undefined 0213 QVERIFY(out.contains("] = \"a\"")); 0214 QVERIFY(out.contains("] = \"bc\"")); 0215 QVERIFY(out.contains("] = \"d\"")); 0216 } 0217 } 0218 { // <struct A> 0219 runToLine(42); 0220 QByteArray out = gdb.execute("print structList"); 0221 QVERIFY(out.contains(QString("%1<A> (size = 0)").arg(container).toLocal8Bit())); 0222 gdb.execute("next"); 0223 out = gdb.execute("print structList"); 0224 QVERIFY(out.contains(QString("%1<A> (size = 1)").arg(container).toLocal8Bit())); 0225 QVERIFY(out.contains("[0] = {")); 0226 QVERIFY(out.contains("a = \"a\"")); 0227 QVERIFY(out.contains("b = \"b\"")); 0228 QVERIFY(out.contains("c = 100")); 0229 QVERIFY(out.contains("d = -200")); 0230 gdb.execute("next"); 0231 out = gdb.execute("print structList"); 0232 QVERIFY(out.contains(QString("%1<A> (size = 2)").arg(container).toLocal8Bit())); 0233 QVERIFY(out.contains("[1] = {")); 0234 } 0235 { // <int*> 0236 runToLine(46); 0237 QByteArray out = gdb.execute("print pointerList"); 0238 QVERIFY(out.contains(QString("%1<int *> (size = 0)").arg(container).toLocal8Bit())); 0239 gdb.execute("next"); 0240 out = gdb.execute("print pointerList"); 0241 QVERIFY(out.contains(QString("%1<int *> (size = 2)").arg(container).toLocal8Bit())); 0242 QVERIFY(out.contains("[0] = 0x")); 0243 QVERIFY(out.contains("[1] = 0x")); 0244 QVERIFY(!out.contains("[2] = 0x")); 0245 gdb.execute("next"); 0246 out = gdb.execute("print pointerList"); 0247 QVERIFY(out.contains(QString("%1<int *> (size = 3)").arg(container).toLocal8Bit())); 0248 QVERIFY(out.contains("[0] = 0x")); 0249 QVERIFY(out.contains("[1] = 0x")); 0250 QVERIFY(out.contains("[2] = 0x")); 0251 } 0252 { // <QPair<int, int> > 0253 runToLine(51); 0254 QByteArray out = gdb.execute("print pairList"); 0255 QVERIFY(out.contains(QString("%1<QPair<int, int>> (size = 0)").arg(container).toLocal8Bit())); 0256 gdb.execute("next"); 0257 out = gdb.execute("print pairList"); 0258 QVERIFY(out.contains(QString("%1<QPair<int, int>> (size = 2)").arg(container).toLocal8Bit())); 0259 if (container != QLatin1String("QSet")) { 0260 QVERIFY(out.contains("[0] = {\n first = 1,\n second = 2\n }")); 0261 QVERIFY(out.contains("[1] = {\n first = 2,\n second = 3\n }")); 0262 } else { // order is undefined in QSet 0263 QVERIFY(out.contains("] = {\n first = 1,\n second = 2\n }")); 0264 QVERIFY(out.contains("] = {\n first = 2,\n second = 3\n }")); 0265 } 0266 QVERIFY(!out.contains("[2] = ")); 0267 gdb.execute("next"); 0268 out = gdb.execute("print pairList"); 0269 QVERIFY(out.contains(QString("%1<QPair<int, int>> (size = 3)").arg(container).toLocal8Bit())); 0270 if (container != QLatin1String("QSet")) { 0271 QVERIFY(out.contains("[0] = {\n first = 1,\n second = 2\n }")); 0272 QVERIFY(out.contains("[1] = {\n first = 2,\n second = 3\n }")); 0273 QVERIFY(out.contains("[2] = {\n first = 4,\n second = 5\n }")); 0274 } else { // order is undefined in QSet 0275 QVERIFY(out.contains("] = {\n first = 1,\n second = 2\n }")); 0276 QVERIFY(out.contains("] = {\n first = 2,\n second = 3\n }")); 0277 QVERIFY(out.contains("] = {\n first = 4,\n second = 5\n }")); 0278 } 0279 } 0280 } 0281 0282 void QtPrintersTest::testQMapInt() 0283 { 0284 GdbProcess gdb(QStringLiteral("debuggee_qmapint")); 0285 gdb.execute("break qmapint.cpp:7"); 0286 gdb.execute("run"); 0287 QByteArray out = gdb.execute("print m"); 0288 QVERIFY(out.contains("QMap<int, int> (size = 2)")); 0289 QVERIFY(out.contains("[10] = 100")); 0290 QVERIFY(out.contains("[20] = 200")); 0291 gdb.execute("next"); 0292 out = gdb.execute("print m"); 0293 QVERIFY(out.contains("QMap<int, int> (size = 3)")); 0294 QVERIFY(out.contains("[30] = 300")); 0295 } 0296 0297 void QtPrintersTest::testQMapString() 0298 { 0299 GdbProcess gdb(QStringLiteral("debuggee_qmapstring")); 0300 gdb.execute("break qmapstring.cpp:8"); 0301 gdb.execute("run"); 0302 QByteArray out = gdb.execute("print m"); 0303 QVERIFY(out.contains("QMap<QString, QString> (size = 2)")); 0304 QVERIFY(out.contains("[\"10\"] = \"100\"")); 0305 QVERIFY(out.contains("[\"20\"] = \"200\"")); 0306 gdb.execute("next"); 0307 out = gdb.execute("print m"); 0308 QVERIFY(out.contains("QMap<QString, QString> (size = 3)")); 0309 QVERIFY(out.contains("[\"30\"] = \"300\"")); 0310 } 0311 0312 void QtPrintersTest::testQMapStringBool() 0313 { 0314 GdbProcess gdb(QStringLiteral("debuggee_qmapstringbool")); 0315 gdb.execute("break qmapstringbool.cpp:8"); 0316 gdb.execute("run"); 0317 QByteArray out = gdb.execute("print m"); 0318 QVERIFY(out.contains("QMap<QString, bool> (size = 2)")); 0319 QVERIFY(out.contains("[\"10\"] = true")); 0320 QVERIFY(out.contains("[\"20\"] = false")); 0321 gdb.execute("next"); 0322 out = gdb.execute("print m"); 0323 QVERIFY(out.contains("QMap<QString, bool> (size = 3)")); 0324 QVERIFY(out.contains("[\"30\"] = true")); 0325 } 0326 0327 0328 void QtPrintersTest::testQDate() 0329 { 0330 GdbProcess gdb(QStringLiteral("debuggee_qdate")); 0331 gdb.execute("break qdate.cpp:6"); 0332 gdb.execute("run"); 0333 QByteArray out = gdb.execute("print d"); 0334 QVERIFY(out.contains("2010-01-20")); 0335 } 0336 0337 void QtPrintersTest::testQTime() 0338 { 0339 GdbProcess gdb(QStringLiteral("debuggee_qtime")); 0340 gdb.execute("break qtime.cpp:6"); 0341 gdb.execute("run"); 0342 QByteArray out = gdb.execute("print t"); 0343 QVERIFY(out.contains("15:30:10.123")); 0344 } 0345 0346 void QtPrintersTest::testQDateTime() 0347 { 0348 GdbProcess gdb(QStringLiteral("debuggee_qdatetime")); 0349 gdb.execute("break qdatetime.cpp:5"); 0350 gdb.execute("run"); 0351 QByteArray out = gdb.execute("print dt"); 0352 QVERIFY(out.contains("Wed Jan 20 15:31:13 2010")); 0353 } 0354 0355 void QtPrintersTest::testQUrl() 0356 { 0357 GdbProcess gdb(QStringLiteral("debuggee_qurl")); 0358 gdb.execute("break qurl.cpp:7"); 0359 gdb.execute("run"); 0360 0361 QByteArray out = gdb.execute("print u"); 0362 QVERIFY(out.contains("http://user@www.kdevelop.org:12345/foo?xyz=bar#asdf")); 0363 0364 const auto localFile = gdb.execute("print localFile"); 0365 QVERIFY(localFile.contains("file:///usr/bin/kdevelop")); 0366 0367 const auto defaultConstructed = gdb.execute("print defaultConstructed"); 0368 QVERIFY(defaultConstructed.contains("<invalid>")); 0369 } 0370 0371 void QtPrintersTest::testQHashInt() 0372 { 0373 GdbProcess gdb(QStringLiteral("debuggee_qhashint")); 0374 gdb.execute("break qhashint.cpp:7"); 0375 gdb.execute("run"); 0376 QByteArray out = gdb.execute("print h"); 0377 QVERIFY(out.contains("QHash<int, int> (size = 2)")); 0378 QVERIFY(out.contains("[10] = 100")); 0379 QVERIFY(out.contains("[20] = 200")); 0380 gdb.execute("next"); 0381 out = gdb.execute("print h"); 0382 QVERIFY(out.contains("QHash<int, int> (size = 3)")); 0383 QVERIFY(out.contains("[30] = 300")); 0384 } 0385 0386 void QtPrintersTest::testQHashString() 0387 { 0388 GdbProcess gdb(QStringLiteral("debuggee_qhashstring")); 0389 gdb.execute("break qhashstring.cpp:8"); 0390 gdb.execute("run"); 0391 QByteArray out = gdb.execute("print h"); 0392 QVERIFY(out.contains("QHash<QString, QString> (size = 2)")); 0393 QVERIFY(out.contains("[\"10\"] = \"100\"")); 0394 QVERIFY(out.contains("[\"20\"] = \"200\"")); 0395 gdb.execute("next"); 0396 out = gdb.execute("print h"); 0397 QVERIFY(out.contains("QHash<QString, QString> (size = 3)")); 0398 QVERIFY(out.contains("[\"30\"] = \"300\"")); 0399 } 0400 0401 void QtPrintersTest::testQSetInt() 0402 { 0403 GdbProcess gdb(QStringLiteral("debuggee_qsetint")); 0404 gdb.execute("break qsetint.cpp:7"); 0405 gdb.execute("run"); 0406 QByteArray out = gdb.execute("print s"); 0407 QVERIFY(out.contains("QSet<int> (size = 2)")); 0408 QVERIFY(out.contains("] = 10")); 0409 QVERIFY(out.contains("] = 20")); 0410 gdb.execute("next"); 0411 out = gdb.execute("print s"); 0412 QVERIFY(out.contains("QSet<int> (size = 3)")); 0413 QVERIFY(out.contains("] = 30")); 0414 } 0415 0416 void QtPrintersTest::testQSetString() 0417 { 0418 GdbProcess gdb(QStringLiteral("debuggee_qsetstring")); 0419 gdb.execute("break qsetstring.cpp:8"); 0420 gdb.execute("run"); 0421 QByteArray out = gdb.execute("print s"); 0422 QVERIFY(out.contains("QSet<QString> (size = 2)")); 0423 QVERIFY(out.contains("] = \"10\"")); 0424 QVERIFY(out.contains("] = \"20\"")); 0425 gdb.execute("next"); 0426 out = gdb.execute("print s"); 0427 QVERIFY(out.contains("QSet<QString> (size = 3)")); 0428 QVERIFY(out.contains("] = \"30\"")); 0429 } 0430 0431 void QtPrintersTest::testQChar() 0432 { 0433 GdbProcess gdb(QStringLiteral("debuggee_qchar")); 0434 gdb.execute("break qchar.cpp:5"); 0435 gdb.execute("run"); 0436 QVERIFY(gdb.execute("print c").contains("\"k\"")); 0437 } 0438 0439 void QtPrintersTest::testQListPOD() 0440 { 0441 GdbProcess gdb(QStringLiteral("debuggee_qlistpod")); 0442 gdb.execute("break qlistpod.cpp:31"); 0443 gdb.execute("run"); 0444 QVERIFY(gdb.execute("print b").contains("false")); 0445 QVERIFY(gdb.execute("print c").contains("50")); 0446 QVERIFY(gdb.execute("print uc").contains("50")); 0447 QVERIFY(gdb.execute("print s").contains("50")); 0448 QVERIFY(gdb.execute("print us").contains("50")); 0449 QVERIFY(gdb.execute("print i").contains("50")); 0450 QVERIFY(gdb.execute("print ui").contains("50")); 0451 QVERIFY(gdb.execute("print l").contains("50")); 0452 QVERIFY(gdb.execute("print ul").contains("50")); 0453 QVERIFY(gdb.execute("print i64").contains("50")); 0454 QVERIFY(gdb.execute("print ui64").contains("50")); 0455 QVERIFY(gdb.execute("print f").contains("50")); 0456 QVERIFY(gdb.execute("print d").contains("50")); 0457 } 0458 0459 void QtPrintersTest::testQUuid() 0460 { 0461 GdbProcess gdb(QStringLiteral("debuggee_quuid")); 0462 gdb.execute("break quuid.cpp:4"); 0463 gdb.execute("run"); 0464 QByteArray data = gdb.execute("print id"); 0465 QVERIFY(data.contains("{9ec3b70b-d105-42bf-b3b4-656e44d2e223}")); 0466 } 0467 0468 void QtPrintersTest::testQVariant() 0469 { 0470 GdbProcess gdb(QStringLiteral("debuggee_qvariant")); 0471 0472 auto printNext = [&]() { 0473 gdb.execute("next"); 0474 return gdb.execute("print v"); 0475 }; 0476 0477 gdb.execute("break qvariant.cpp:13"); 0478 gdb.execute("run"); 0479 0480 QVERIFY(printNext().contains("QVariant(NULL)")); 0481 QVERIFY(printNext().contains("QVariant(QString, \"KDevelop (QString)\")")); 0482 QVERIFY(printNext().contains("QVariant(QByteArray, \"KDevelop (QByteArray)\" = {")); 0483 QVERIFY(printNext().contains("QVariant(signed char, -8")); 0484 QVERIFY(printNext().contains("QVariant(uchar, 8")); 0485 QVERIFY(printNext().contains("QVariant(short, -16)")); 0486 QVERIFY(printNext().contains("QVariant(ushort, 16)")); 0487 QVERIFY(printNext().contains("QVariant(int, -32)")); 0488 QVERIFY(printNext().contains("QVariant(uint, 32)")); 0489 QVERIFY(printNext().contains("QVariant(qlonglong, -64)")); 0490 QVERIFY(printNext().contains("QVariant(qulonglong, 64)")); 0491 QVERIFY(printNext().contains("QVariant(bool, true)")); 0492 QVERIFY(printNext().contains("QVariant(float, 4.5)")); 0493 QVERIFY(printNext().contains("QVariant(double, 42.5)")); 0494 QVERIFY(printNext().contains("QVariant(QObject*, 0x")); 0495 QVERIFY(printNext().contains("QVariant(SomeCustomType, {\n foo = 42\n})")); 0496 } 0497 0498 void QtPrintersTest::testKTextEditorTypes() 0499 { 0500 GdbProcess gdb(QStringLiteral("debuggee_ktexteditortypes")); 0501 gdb.execute("break ktexteditortypes.cpp:9"); 0502 gdb.execute("run"); 0503 0504 QByteArray data = gdb.execute("print cursor"); 0505 QCOMPARE(data, QByteArray("$1 = [1, 1]")); 0506 data = gdb.execute("print range"); 0507 QCOMPARE(data, QByteArray("$2 = [(1, 1) -> (2, 2)]")); 0508 } 0509 0510 void QtPrintersTest::testKDevelopTypes() 0511 { 0512 GdbProcess gdb(QStringLiteral("debuggee_kdeveloptypes")); 0513 gdb.execute("break kdeveloptypes.cpp:12"); 0514 const auto runMessage = gdb.execute("run"); 0515 if (runMessage.contains("ASan runtime does not come first")) 0516 QSKIP("cannot run this test in an ASan build configuration"); 0517 0518 QVERIFY(gdb.execute("print path1").contains("(\"tmp\", \"foo\")")); 0519 QVERIFY(gdb.execute("print path2").contains("(\"http://www.test.com\", \"tmp\", \"asdf.txt\")")); 0520 } 0521 0522 QTEST_MAIN(QtPrintersTest) 0523 0524 #include "test_gdbprinters.moc" 0525 #include "moc_test_gdbprinters.cpp"