diff --git a/pmu/sampler.cpp b/pmu/sampler.cpp index 3fd1a17183276fdcb89b9f8ea8988efb6e06e9c1..7a50838b546fe7445a35a64c8ea465a038c2edde 100644 --- a/pmu/sampler.cpp +++ b/pmu/sampler.cpp @@ -31,6 +31,7 @@ #include "process_map.h" #include "log.h" #include "sampler.h" +#include "common.h" using namespace std; @@ -131,14 +132,21 @@ void KUNPENG_PMU::PerfSampler::RawSampleProcess( KUNPENG_PMU::PerfRawSample *sample = (KUNPENG_PMU::PerfRawSample *)event->sample.array; if (symMode != NO_SYMBOL_RESOLVE) { // Copy ips from ring buffer and get stack info later. - if (evt->callStack == 0 && sample->nr - 1 >= 0) { - ips->ips.push_back(sample->ips[sample->nr - 1]); + if (evt->callStack == 0) { + int i = 0; + while (i < sample->nr && !IsValidIp(sample->ips[i])) { + i++; + } + if (i < sample->nr) { + ips->ips.push_back(sample->ips[i]); + } } else { for (int i = sample->nr - 1; i >= 0; --i) { - ips->ips.push_back(sample->ips[i]); + if (IsValidIp(sample->ips[i])) { + ips->ips.push_back(sample->ips[i]); + } } } - } current->cpu = static_cast(sample->cpu); current->pid = static_cast(sample->pid); @@ -191,6 +199,12 @@ void KUNPENG_PMU::PerfSampler::FillComm(const size_t &start, const size_t &end, auto& pmuData = data[i]; auto findProc = procMap.find(pmuData.tid); if (findProc == procMap.end()) { + UpdatePidInfo(pmuData.pid, pmuData.tid); + findProc = procMap.find(pmuData.tid); + if (findProc == procMap.end()) { + continue; + } + pmuData.comm = findProc->second->comm; continue; } pmuData.comm = findProc->second->comm; diff --git a/util/common.cpp b/util/common.cpp index 369ba9410f8cb338139116dd12ae7fcde7cde004..a13efe674cf48eaf18cb950d9f722d4e39ed16ec 100644 --- a/util/common.cpp +++ b/util/common.cpp @@ -21,6 +21,12 @@ #include "pcerrc.h" #include "common.h" +bool IsValidIp(unsigned long ip) { + return (ip != PERF_CONTEXT_HV && ip != PERF_CONTEXT_KERNEL && ip != PERF_CONTEXT_USER + && ip != PERF_CONTEXT_GUEST && ip != PERF_CONTEXT_GUEST_KERNEL + && ip != PERF_CONTEXT_GUEST_USER && ip != PERF_CONTEXT_MAX); +} + std::string GetRealPath(const std::string filePath) { char resolvedPath[PATH_MAX]; diff --git a/util/common.h b/util/common.h index a5c629a4261f0504f2dc7d32eed9503aa71967f0..1e324a23298ffe827ad09311894f58d558017fb1 100644 --- a/util/common.h +++ b/util/common.h @@ -15,8 +15,10 @@ #ifndef LIBKPROF_COMMON_H #define LIBKPROF_COMMON_H +#include #include +bool IsValidIp(unsigned long ip); std::string GetRealPath(const std::string filePath); bool IsValidPath(const std::string& filePath); int RaiseNumFd(uint64_t numFd);