From 10f7c6eb6d910e785d606d79804b04ec2ea521bb Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Mon, 3 Mar 2025 22:03:43 +0800 Subject: [PATCH 1/2] process kernel callchain Signed-off-by: yuyanqinghw --- include/virtual_runtime.h | 2 ++ src/virtual_runtime.cpp | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/virtual_runtime.h b/include/virtual_runtime.h index 72ab1a4..bed48bb 100644 --- a/include/virtual_runtime.h +++ b/include/virtual_runtime.h @@ -170,6 +170,7 @@ private: bool disableUnwind_ = true; bool enableDebugInfoSymbolic_ = false; bool dedupStack_ = false; + bool isRoot_ = IsRoot(); size_t callstackMergeLevel_ = 1; std::ifstream savedCmdLines_; #if defined(is_ohos) && is_ohos @@ -228,6 +229,7 @@ private: // kernel thread void UpdateKernelThreadMap(pid_t pid, uint64_t begin, uint64_t len, uint64_t offset, std::string filename); bool CheckValidSandBoxMmap(PerfRecordMmap2 &recordMmap2); + void ProcessKernelCallChain(PerfRecordSample &sample); }; } // namespace HiPerf } // namespace Developtools diff --git a/src/virtual_runtime.cpp b/src/virtual_runtime.cpp index 7f6aa12..0a41404 100644 --- a/src/virtual_runtime.cpp +++ b/src/virtual_runtime.cpp @@ -583,6 +583,25 @@ void VirtualRuntime::NeedDropKernelCallChain(PerfRecordSample &sample) } } +void VirtualRuntime::ProcessKernelCallChain(PerfRecordSample &sample) +{ +#if defined(is_ohos) && is_ohos + if (isRoot_) { + return; + } + if (recordCallBack_ != nullptr) { + for (u64 i = 0; i < sample.data_.nr; i++) { + if (sample.data_.ips[i] >= PERF_CONTEXT_MAX) { + continue; + } + if (sample.data_.ips[i] >= 0xffff000000000000) { + sample.data_.ips[i] = sample.data_.ips[i] & 0xffffff0000000fff; + } + } + } +#endif +} + void VirtualRuntime::UnwindFromRecord(PerfRecordSample &recordSample) { #if defined(is_ohos) && is_ohos @@ -590,6 +609,7 @@ void VirtualRuntime::UnwindFromRecord(PerfRecordSample &recordSample) const auto startTime = steady_clock::now(); #endif HLOGV("unwind record (time:%llu)", recordSample.data_.time); + ProcessKernelCallChain(recordSample); // if we have userstack ? if (recordSample.data_.stack_size > 0) { pid_t serverPid = recordSample.GetUstackServerPid(); -- Gitee From 48f1f4341f22e5995970e008c14f6596175f2e02 Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Mon, 3 Mar 2025 22:28:03 +0800 Subject: [PATCH 2/2] process kernel callchain Signed-off-by: yuyanqinghw --- include/virtual_runtime.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/virtual_runtime.h b/include/virtual_runtime.h index bed48bb..68b608c 100644 --- a/include/virtual_runtime.h +++ b/include/virtual_runtime.h @@ -170,7 +170,7 @@ private: bool disableUnwind_ = true; bool enableDebugInfoSymbolic_ = false; bool dedupStack_ = false; - bool isRoot_ = IsRoot(); + const bool isRoot_ = IsRoot(); size_t callstackMergeLevel_ = 1; std::ifstream savedCmdLines_; #if defined(is_ohos) && is_ohos -- Gitee