From 8db1665ade734265254404eea8a4cc291ca1205d Mon Sep 17 00:00:00 2001 From: Thomas McGuire Date: Tue, 13 Feb 2018 15:30:53 +0100 Subject: 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 --- app/perfkallsyms.cpp | 3 ++- 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("expectedAddress"); QTest::addColumn("expectedSymbol"); QTest::addColumn("expectedModule"); + QTest::addColumn("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::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::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() -- cgit v1.2.3