From 3141429812ea5d887004047dd9242d48ee4f3e5a Mon Sep 17 00:00:00 2001 From: Lieven Hey Date: Mon, 11 Nov 2024 16:04:48 +0100 Subject: [PATCH] feat: Parse tracepoint data in hotspot --- 3rdparty/perfparser | 2 +- src/parsers/perf/perfparser.cpp | 64 ++++++++++++++++++++++++++++++--- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/3rdparty/perfparser b/3rdparty/perfparser index e64b883a..5a1a9aa1 160000 --- a/3rdparty/perfparser +++ b/3rdparty/perfparser @@ -1 +1 @@ -Subproject commit e64b883a563ac01c9b816c1d3f12cb114488e579 +Subproject commit 5a1a9aa1ecf9b83725613b41ea123f66e8672c08 diff --git a/src/parsers/perf/perfparser.cpp b/src/parsers/perf/perfparser.cpp index e6f99a6a..246d214b 100644 --- a/src/parsers/perf/perfparser.cpp +++ b/src/parsers/perf/perfparser.cpp @@ -299,6 +299,8 @@ struct Sample : Record QVector frames; quint8 guessedFrames = 0; QVector costs; + quint32 tracePointFormat = std::numeric_limits::max(); + quint32 tracePointData = std::numeric_limits::max(); }; QDataStream& operator>>(QDataStream& stream, Sample& sample) @@ -539,6 +541,43 @@ QDebug operator<<(QDebug stream, const Error& error) return stream; } +struct TracePointFormat +{ + StringId systemId; + StringId nameId; + quint32 flags = 0; + StringId format; +}; + +QDataStream& operator>>(QDataStream& stream, TracePointFormat& format) +{ + stream >> format.systemId >> format.nameId >> format.flags >> format.format; + return stream; +} + +QDebug operator<<(QDebug stream, TracePointFormat format) +{ + stream.noquote().nospace() << "TracePointFormat{" + << "systemId=" << format.systemId << ", " + << "nameId=" << format.nameId << ", " + << "flags=" << format.flags << ", " + << "format=" << format.format << "}"; + return stream; +} + +using TracePointData = QHash; + +QDebug operator<<(QDebug stream, const TracePointData& traceData) +{ + auto s = stream.noquote().nospace(); + s << "TracePointData{"; + for (auto it = traceData.cbegin(), end = traceData.cend(); it != end; it++) { + s << it.key() << "=" << it.value() << ", "; + } + s << "}"; + return stream; +} + void addCallerCalleeEvent(const Data::Symbol& symbol, const Data::Location& location, int type, quint64 cost, QSet* recursionGuard, Data::CallerCalleeResults* callerCalleeResult, int numCosts) @@ -760,11 +799,19 @@ class PerfParserPrivate : public QObject } } + if (static_cast(eventType) == EventType::TracePointSample) { + quint32 eventFormatId; + TracePointData traceData; + stream >> eventFormatId >> traceData; + tracepointData[eventFormatId].push_back(traceData); + qCDebug(LOG_PERFPARSER) << "parsed:" << traceData; + sample.tracePointFormat = eventFormatId; + sample.tracePointData = tracepointData.size() - 1; + } + addRecord(sample); addSample(sample); - if (static_cast(eventType) == EventType::TracePointSample) - return true; // TODO: read full data break; } case EventType::ThreadStart: { @@ -876,9 +923,14 @@ class PerfParserPrivate : public QObject emit debugInfoDownloadProgress(strings.value(module.id), strings.value(url.id), numerator, denominator); break; } - case EventType::TracePointFormat: - // TODO: implement me - return true; + case EventType::TracePointFormat: { + qint32 id; + TracePointFormat format; + stream >> id >> format; + qCDebug(LOG_PERFPARSER) << "parsed:" << format; + tracepointFormat[id] = format; + break; + } case EventType::InvalidType: break; } @@ -1435,6 +1487,8 @@ class PerfParserPrivate : public QObject QHash m_lastSampleTimePerCore; Settings::CostAggregation costAggregation; bool perfMapFileExists = false; + QHash tracepointFormat; + QHash> tracepointData; // samples recorded without --call-graph have only one frame int m_numSamplesWithMoreThanOneFrame = 0;