From 21fe6b6213ac0cf1fdd0ee7ad872dabb0c21befd Mon Sep 17 00:00:00 2001 From: DCHii <13780064348@163.com> Date: Wed, 15 May 2024 14:13:13 +0800 Subject: [PATCH] Fix get comm bug and Exclude illegal ips for sampling --- pmu/sampler.cpp | 22 ++++++++++++++++++---- util/common.cpp | 6 ++++++ util/common.h | 2 ++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/pmu/sampler.cpp b/pmu/sampler.cpp index 3fd1a17..7a50838 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 369ba94..a13efe6 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 a5c629a..1e324a2 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); -- Gitee