diff --git a/pmu/sampler.cpp b/pmu/sampler.cpp index dc1f1498ee7f33683ebddb469f2095125a656d7a..10bd5bfccd93b4ba7dafa0dc13acb00d0f9b99ff 100644 --- a/pmu/sampler.cpp +++ b/pmu/sampler.cpp @@ -123,6 +123,20 @@ void KUNPENG_PMU::PerfSampler::UpdatePidInfo(const pid_t &pid, const int &tid) } } +void KUNPENG_PMU::PerfSampler::UpdateCommInfo(KUNPENG_PMU::PerfEvent *event) +{ + auto findProc = procMap.find(event->comm.tid); + if (findProc == procMap.end()) { + std::shared_ptr procTopo(new ProcTopology{0}, FreeProcTopo); + procTopo->tid = event->comm.tid; + procTopo->pid = event->comm.pid; + procTopo->comm = static_cast(malloc(strlen(event->comm.comm) + 1)); + strcpy(procTopo->comm, event->comm.comm); + DBG_PRINT("Add to proc map: %d\n", event->comm.tid); + procMap[event->comm.tid] = procTopo; + } +} + void KUNPENG_PMU::PerfSampler::RawSampleProcess( struct PmuData *current, PerfSampleIps *ips, union KUNPENG_PMU::PerfEvent *event) { @@ -185,6 +199,10 @@ void KUNPENG_PMU::PerfSampler::ReadRingBuffer(vector &data, vectorfork.pid, event->fork.tid); break; } + case PERF_RECORD_COMM: { + UpdateCommInfo(event); + break; + } default: break; } diff --git a/pmu/sampler.h b/pmu/sampler.h index 5509f61e4d8df623fcbfc96d3be25273fec12e31..c7d2844975f3aecc11f641d9f614e5f01ea021e4 100644 --- a/pmu/sampler.h +++ b/pmu/sampler.h @@ -55,6 +55,7 @@ namespace KUNPENG_PMU { void ReadRingBuffer(std::vector &data, std::vector &sampleIps); void FillComm(const size_t &start, const size_t &end, std::vector &data); void UpdatePidInfo(const pid_t &pid, const int &tid); + void UpdateCommInfo(KUNPENG_PMU::PerfEvent *event); static int pages; std::shared_ptr sampleMmap = std::make_shared(); diff --git a/symbol/symbol_resolve.cpp b/symbol/symbol_resolve.cpp index eb9042d54e1ebf465d188ab606882663e16db023..e22d0e36572a02bc97df571ee3364714960a03c1 100644 --- a/symbol/symbol_resolve.cpp +++ b/symbol/symbol_resolve.cpp @@ -62,6 +62,7 @@ const std::string SLASH = "/"; const char DASH = '-'; const char EXE_TYPE = 'x'; char* UNKNOWN = "UNKNOWN"; +char* KERNEL = "[kernel]"; namespace { static inline void SetFalse(bool& flag) @@ -284,11 +285,11 @@ void SymbolUtils::FreeSymbol(struct Symbol* symbol) delete[] symbol->symbolName; symbol->symbolName = nullptr; } - if (symbol->fileName && symbol->fileName != UNKNOWN) { + if (symbol->fileName && symbol->fileName != UNKNOWN && symbol->fileName != KERNEL) { delete[] symbol->fileName; symbol->fileName = nullptr; } - if (symbol->module && symbol->fileName != UNKNOWN) { + if (symbol->module && symbol->module != UNKNOWN && symbol->module != KERNEL) { delete[] symbol->module; symbol->module = nullptr; } @@ -924,7 +925,10 @@ struct Symbol* SymbolResolve::MapAddr(int pid, unsigned long addr) if (addr > KERNEL_START_ADDR) { data = this->MapKernelAddr(addr); if (data == nullptr) { - return nullptr; + auto symbol = InitializeSymbol(addr); + symbol->module = KERNEL; + symbol->fileName = KERNEL; + return symbol; } data->offset = addr - data->addr; } else {