diff --git a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp index f62cda3bcf3430b64783cb65f9a5ce26a207dd36..cf57cb6b7ce6a911da05652956e79a01a6b71717 100644 --- a/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp +++ b/trace_streamer/src/parser/pbreader_parser/htrace_parser/htrace_event_parser.cpp @@ -567,8 +567,13 @@ bool HtraceEventParser::SchedBlockReasonEvent(const EventInfo &event) ProtoReader::SchedBlockedReasonFormat_Reader msg(event.detail); uint32_t pid = msg.pid(); uint32_t ioWait = msg.io_wait(); - auto caller = traceDataCache_->GetDataIndex( - std::string_view("0x" + SysTuning::base::number(msg.caller(), SysTuning::base::INTEGER_RADIX_TYPE_HEX))); + std::string callerStr; + if (msg.caller_str().ToStdString().empty()) { + callerStr = "0x" + SysTuning::base::number(msg.caller(), SysTuning::base::INTEGER_RADIX_TYPE_HEX); + } else { + callerStr = msg.caller_str().ToStdString(); + } + auto caller = traceDataCache_->GetDataIndex(std::string_view(callerStr)); auto itid = streamFilters_->processFilter_->UpdateOrCreateThread(event.timeStamp, pid); if (streamFilters_->cpuFilter_->InsertBlockedReasonEvent(event.cpu, itid, ioWait, caller, INVALID_UINT32)) { streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_RECEIVED); diff --git a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp index 8af52df4e3e39a92ecd18d2a030a5aff5076ab7c..08ee4994d99801f6a58224fed7f42be4bd671ed5 100644 --- a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp @@ -287,8 +287,13 @@ bool CpuDetailParser::SchedBlockReasonEvent(const RawTraceEventInfo &event) { auto reasonMsg = event.msgPtr->sched_blocked_reason_format(); streamFilters_->statFilter_->IncreaseStat(TRACE_EVENT_SCHED_BLOCKED_REASON, STAT_EVENT_RECEIVED); - auto caller = traceDataCache_->GetDataIndex( - std::string_view("0x" + SysTuning::base::number(reasonMsg.caller(), SysTuning::base::INTEGER_RADIX_TYPE_HEX))); + std::string callerStr; + if (reasonMsg.caller_str().empty()) { + callerStr = "0x" + SysTuning::base::number(reasonMsg.caller(), SysTuning::base::INTEGER_RADIX_TYPE_HEX); + } else { + callerStr = reasonMsg.caller_str(); + } + auto caller = traceDataCache_->GetDataIndex(std::string_view(callerStr)); auto itid = streamFilters_->processFilter_->UpdateOrCreateThread(event.msgPtr->timestamp(), reasonMsg.pid()); if (streamFilters_->cpuFilter_->InsertBlockedReasonEvent(event.cpuId, itid, reasonMsg.io_wait(), caller, INVALID_UINT32)) { diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp index a7ef062e1d2299d16c0718c9d947a72824d4465c..acfa189970478bf81554598bfe3f6a3ca2db2371 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp @@ -16,6 +16,7 @@ #include "rawtrace_parser/ftrace_field_processor.h" #include #include +#include namespace SysTuning { namespace TraceStreamer { @@ -265,6 +266,16 @@ bool FtraceEventProcessor::SchedBlockedReason(FtraceEvent &ftraceEvent, schedBlockedMsg->set_pid(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); schedBlockedMsg->set_caller(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); schedBlockedMsg->set_io_wait(FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size)); + if (format.fields.size() == SCHED_BLOCKED_REASON_FIELD_SIZE_EIGHT) { + index++; // skip delay field + uint64_t offset = FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size); + uint64_t siz = FtraceFieldProcessor::HandleIntField(format.fields, index++, data, size); + std::string funcName = FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size); + std::string modName = FtraceFieldProcessor::HandleStrField(format.fields, index++, data, size); + std::ostringstream caller; + caller << funcName << "+0x" << std::hex << offset << "/0x" << std::hex << siz << "[" << modName << "]"; + schedBlockedMsg->set_caller_str(caller.str()); + } return true; } bool FtraceEventProcessor::SchedWakeup(FtraceEvent &ftraceEvent, uint8_t data[], size_t size, const EventFormat &format) diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h index 9d95feb7fa735aa956a549c820211814ea552e8b..3fe404dc0183824fff5be755f811f71cf16ca16c 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h @@ -95,6 +95,7 @@ private: std::map eventIdToNames_; std::map eventNameToFunctions_; TraceStreamerConfig config_; + const uint32_t SCHED_BLOCKED_REASON_FIELD_SIZE_EIGHT = 8; }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/protos/types/plugins/ftrace_data/default/sched.proto b/trace_streamer/src/protos/types/plugins/ftrace_data/default/sched.proto index c1db507fcbc02fe88ad47f59e51b2b00b139f346..5d5f377af8195505d849fce3bb49f84796a31c21 100755 --- a/trace_streamer/src/protos/types/plugins/ftrace_data/default/sched.proto +++ b/trace_streamer/src/protos/types/plugins/ftrace_data/default/sched.proto @@ -23,6 +23,7 @@ message SchedBlockedReasonFormat { int32 pid = 1; uint64 caller = 2; uint32 io_wait = 3; + string caller_str = 4; } // /sys/kernel/debug/tracing/events/sched/sched_kthread_stop/format