summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas McGuire <thomas.mcguire@kdab.com>2018-02-13 15:30:53 +0100
committerUlf Hermann <ulf.hermann@qt.io>2019-05-03 12:41:36 +0000
commit8db1665ade734265254404eea8a4cc291ca1205d (patch)
tree33b23c7bfcb4953684b4a056082f22221ed88235
parent94093989c58d3afab3aaf278d1d761d06361045e (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.cpp3
-rw-r--r--tests/auto/kallsyms/tst_kallsyms.cpp43
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()