diff options
author | Thomas McGuire <thomas.mcguire@kdab.com> | 2018-02-13 15:30:53 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2019-05-03 12:41:36 +0000 |
commit | 8db1665ade734265254404eea8a4cc291ca1205d (patch) | |
tree | 33b23c7bfcb4953684b4a056082f22221ed88235 | |
parent | 94093989c58d3afab3aaf278d1d761d06361045e (diff) |
Ignore kallsyms mappings with address 0
kallsyms files with all addresses being 0 can happen. In this case,
ignore the mapping, as otherwise an address would resolve to a random
kernel symbol.
In addition, now perfparser shows a correct error message about being
unable to open the mapping.
Fixes KDAB/hotspot#117
Change-Id: Ib7ccf2f405f3a0a2149fa747175fb9feb11dfb07
Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
-rw-r--r-- | app/perfkallsyms.cpp | 3 | ||||
-rw-r--r-- | tests/auto/kallsyms/tst_kallsyms.cpp | 43 |
2 files changed, 26 insertions, 20 deletions
diff --git a/app/perfkallsyms.cpp b/app/perfkallsyms.cpp index 1a64cbd..0ef016e 100644 --- a/app/perfkallsyms.cpp +++ b/app/perfkallsyms.cpp @@ -62,7 +62,8 @@ bool PerfKallsyms::parseMapping(const QString &path) if (eol == '\t') stream >> entry.module; - m_entries.push_back(entry); + if (entry.address != 0) + m_entries.push_back(entry); } if (valid && m_entries.isEmpty()) { diff --git a/tests/auto/kallsyms/tst_kallsyms.cpp b/tests/auto/kallsyms/tst_kallsyms.cpp index ab89096..6d9e31c 100644 --- a/tests/auto/kallsyms/tst_kallsyms.cpp +++ b/tests/auto/kallsyms/tst_kallsyms.cpp @@ -35,6 +35,7 @@ private slots: QTest::addColumn<quint64>("expectedAddress"); QTest::addColumn<QByteArray>("expectedSymbol"); QTest::addColumn<QByteArray>("expectedModule"); + QTest::addColumn<bool>("expectedFailsParse"); { const QByteArray kallsyms = @@ -49,35 +50,36 @@ private slots: "ffffffffa0000de0 T serio_unregister_driver\t[serio]\n"; QTest::newRow("__per_cpu_start:0") << kallsyms << 0x0ull - << 0x0ull << QByteArrayLiteral("__per_cpu_start") << QByteArray(); + << 0x0ull << QByteArray() << QByteArray() << false; QTest::newRow("_stext:0") << kallsyms << 0xffffffff810002b8ull - << 0xffffffff810002b8ull << QByteArrayLiteral("_stext") << QByteArray(); + << 0xffffffff810002b8ull << QByteArrayLiteral("_stext") << QByteArray() << false; QTest::newRow("_stext:2") << kallsyms << (0xffffffff810002b8ll + 0x2ull) - << 0xffffffff810002b8ull << QByteArrayLiteral("_stext") << QByteArray(); + << 0xffffffff810002b8ull << QByteArrayLiteral("_stext") << QByteArray() << false; QTest::newRow("xen_hypercall_set_gdt:0") << kallsyms << 0xffffffff81001040ull - << 0xffffffff81001040ull << QByteArrayLiteral("xen_hypercall_set_gdt") << QByteArray(); + << 0xffffffff81001040ull << QByteArrayLiteral("xen_hypercall_set_gdt") << QByteArray() << false; QTest::newRow("xen_hypercall_set_gdt:256") << kallsyms << (0xffffffff81001040ull + 0x100ull) - << 0xffffffff81001040ull << QByteArrayLiteral("xen_hypercall_set_gdt") << QByteArray(); + << 0xffffffff81001040ull << QByteArrayLiteral("xen_hypercall_set_gdt") << QByteArray() << false; QTest::newRow("xen_hypercall_set_gdt:256") << kallsyms << (0xffffffff81001040ull + 0x100ull) - << 0xffffffff81001040ull << QByteArrayLiteral("xen_hypercall_set_gdt") << QByteArray(); + << 0xffffffff81001040ull << QByteArrayLiteral("xen_hypercall_set_gdt") << QByteArray() << false; QTest::newRow("serio_interrupt:0") << kallsyms << 0xffffffffa0000e80ull - << 0xffffffffa0000e80ull << QByteArrayLiteral("serio_interrupt") << QByteArrayLiteral("[serio]"); - } + << 0xffffffffa0000e80ull << QByteArrayLiteral("serio_interrupt") << QByteArrayLiteral("[serio]") << false; { const auto kallsyms = QByteArrayLiteral("0000000000000000 A irq_stack_union"); QTest::newRow("zeros-only") << kallsyms << 0x0ull - << 0x0ull << QByteArrayLiteral("irq_stack_union") << QByteArray(); + << 0x0ull << QByteArray() << QByteArray() << true; QTest::newRow("zeros-only2") << kallsyms << std::numeric_limits<quint64>::max() << 0x0ull - << QByteArrayLiteral("irq_stack_union") << QByteArray(); + << QByteArray() << QByteArray() << true; } { const auto kallsyms = QByteArrayLiteral(" (null) A irq_stack_union"); QTest::newRow("null-only") << kallsyms << 0x0ull - << 0x0ull << QByteArrayLiteral("irq_stack_union") << QByteArray(); + << 0x0ull << QByteArray() << QByteArray() << true; QTest::newRow("null-only2") << kallsyms << std::numeric_limits<quint64>::max() << 0x0ull - << QByteArrayLiteral("irq_stack_union") << QByteArray(); + << QByteArrayLiteral("irq_stack_union") << QByteArray() << true; + + } } } @@ -88,6 +90,7 @@ private slots: QFETCH(quint64, expectedAddress); QFETCH(QByteArray, expectedSymbol); QFETCH(QByteArray, expectedModule); + QFETCH(bool, expectedFailsParse); QTemporaryFile file; QVERIFY(file.open()); @@ -95,13 +98,15 @@ private slots: file.flush(); PerfKallsyms kallsyms; - QVERIFY(kallsyms.parseMapping(file.fileName())); - QVERIFY(kallsyms.errorString().isEmpty()); - - const auto entry = kallsyms.findEntry(address); - QCOMPARE(entry.address, expectedAddress); - QCOMPARE(entry.symbol, expectedSymbol); - QCOMPARE(entry.module, expectedModule); + QCOMPARE(kallsyms.parseMapping(file.fileName()), !expectedFailsParse); + QVERIFY(kallsyms.errorString().isEmpty() == !expectedFailsParse); + + if (!expectedFailsParse) { + const auto entry = kallsyms.findEntry(address); + QCOMPARE(entry.address, expectedAddress); + QCOMPARE(entry.symbol, expectedSymbol); + QCOMPARE(entry.module, expectedModule); + } } void testProc() |