summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2018-10-23 19:10:35 +0200
committerUlf Hermann <ulf.hermann@qt.io>2019-05-03 12:43:26 +0000
commit9bcb42b50e2c12d873c50c3d33c3d90befa35c8f (patch)
treef11cfb16c37e43d24e3044d9f1f81531842af68f
parent123e9bd37a133ab5c085a83f50e06da565cf924f (diff)
Skip unused data when we fail to fully parse an event
Additionally, print a warning. This uncovers an issue in the sample parsing for perf data files with LBR callchains. Change-Id: Ib87e54dc33013974691da155aae2037332bc82b8 Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
-rw-r--r--app/perfdata.cpp8
1 files changed, 8 insertions, 0 deletions
diff --git a/app/perfdata.cpp b/app/perfdata.cpp
index e1bc69e..b3f18c8 100644
--- a/app/perfdata.cpp
+++ b/app/perfdata.cpp
@@ -67,6 +67,8 @@ PerfData::ReadStatus PerfData::processEvents(QDataStream &stream)
bool sampleIdAll = attrs.sampleIdAll();
quint64 sampleType = attrs.sampleType();
+ const auto oldPos = stream.device()->pos();
+
switch (m_eventHeader.type) {
case PERF_RECORD_MMAP: {
PerfRecordMmap mmap(&m_eventHeader, sampleType, sampleIdAll);
@@ -188,6 +190,12 @@ PerfData::ReadStatus PerfData::processEvents(QDataStream &stream)
break;
}
+ const auto parsedContentSize = stream.device()->pos() - oldPos;
+ if (parsedContentSize != contentSize) {
+ qWarning() << "Event not fully parsed" << m_eventHeader.type << contentSize << parsedContentSize;
+ stream.skipRawData(contentSize - parsedContentSize);
+ }
+
m_eventHeader.size = 0;
return SignalFinished;