From a9b51c1cd6deba2dbce1dad5d0817ef1e78b3dfb Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Tue, 11 Mar 2025 17:33:46 +0800 Subject: [PATCH 1/5] adjust callchain pcs Signed-off-by: yuyanqinghw --- include/virtual_runtime.h | 2 ++ src/virtual_runtime.cpp | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/virtual_runtime.h b/include/virtual_runtime.h index 68b608c..b965b22 100644 --- a/include/virtual_runtime.h +++ b/include/virtual_runtime.h @@ -230,6 +230,8 @@ private: 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); + void AdjustCallChain(PerfRecordSample &sample); + }; } // namespace HiPerf } // namespace Developtools diff --git a/src/virtual_runtime.cpp b/src/virtual_runtime.cpp index 62b027c..4481a8e 100644 --- a/src/virtual_runtime.cpp +++ b/src/virtual_runtime.cpp @@ -583,6 +583,28 @@ void VirtualRuntime::NeedDropKernelCallChain(PerfRecordSample &sample) } } +void VirtualRuntime::AdjustCallChain(PerfRecordSample &sample) +{ +#if defined(is_ohos) && is_ohos + if (!isHM_) { + return; + } + if (recordCallBack_ != nullptr) { + if (sample.data_.ip >= 0x5) { + sample.data_.ip -= 0x4; + } + for (u64 i = 0; i < sample.data_.nr; i++) { + if (sample.data_.ips[i] >= PERF_CONTEXT_MAX) { + continue; + } + if (i>=1 && sample.data_.ips[i] >= 0x5) { + sample.data_.ips[i] -= 0x4; + } + } + } +#endif +} + void VirtualRuntime::ProcessKernelCallChain(PerfRecordSample &sample) { #if defined(is_ohos) && is_ohos @@ -673,6 +695,7 @@ void VirtualRuntime::UpdateFromRecord(PerfRecordSample &recordSample) UpdateThread(pid, pid); } } + AdjustCallChain(recordSample); ProcessKernelCallChain(recordSample); // unwind if (disableUnwind_) { -- Gitee From 9d88111ffc1a6d011c760b66e2ecbdcdaa76db01 Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Tue, 11 Mar 2025 17:36:16 +0800 Subject: [PATCH 2/5] adjust callchain pcs Signed-off-by: yuyanqinghw --- include/virtual_runtime.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/virtual_runtime.h b/include/virtual_runtime.h index b965b22..07bcb36 100644 --- a/include/virtual_runtime.h +++ b/include/virtual_runtime.h @@ -231,7 +231,6 @@ private: bool CheckValidSandBoxMmap(PerfRecordMmap2 &recordMmap2); void ProcessKernelCallChain(PerfRecordSample &sample); void AdjustCallChain(PerfRecordSample &sample); - }; } // namespace HiPerf } // namespace Developtools -- Gitee From e1969b6be04b939100649549e560f2f1ef884ac4 Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Tue, 11 Mar 2025 22:56:29 +0800 Subject: [PATCH 3/5] adjust callchain pcs Signed-off-by: yuyanqinghw --- src/virtual_runtime.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/virtual_runtime.cpp b/src/virtual_runtime.cpp index 4481a8e..eb1f968 100644 --- a/src/virtual_runtime.cpp +++ b/src/virtual_runtime.cpp @@ -590,11 +590,9 @@ void VirtualRuntime::AdjustCallChain(PerfRecordSample &sample) return; } if (recordCallBack_ != nullptr) { - if (sample.data_.ip >= 0x5) { - sample.data_.ip -= 0x4; - } for (u64 i = 0; i < sample.data_.nr; i++) { if (sample.data_.ips[i] >= PERF_CONTEXT_MAX) { + i++; continue; } if (i>=1 && sample.data_.ips[i] >= 0x5) { -- Gitee From a9bf2a95b5101ee0fc8444fb9684c7b0f698bdd9 Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Wed, 12 Mar 2025 14:58:40 +0800 Subject: [PATCH 4/5] adjust callchain pcs Signed-off-by: yuyanqinghw --- src/virtual_runtime.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/virtual_runtime.cpp b/src/virtual_runtime.cpp index eb1f968..3d8fa4f 100644 --- a/src/virtual_runtime.cpp +++ b/src/virtual_runtime.cpp @@ -586,18 +586,16 @@ void VirtualRuntime::NeedDropKernelCallChain(PerfRecordSample &sample) void VirtualRuntime::AdjustCallChain(PerfRecordSample &sample) { #if defined(is_ohos) && is_ohos - if (!isHM_) { + if (!isHM_ || recordCallBack_ == nullptr) { return; } - if (recordCallBack_ != nullptr) { - for (u64 i = 0; i < sample.data_.nr; i++) { - if (sample.data_.ips[i] >= PERF_CONTEXT_MAX) { - i++; - continue; - } - if (i>=1 && sample.data_.ips[i] >= 0x5) { - sample.data_.ips[i] -= 0x4; - } + for (u64 i = 0; i < sample.data_.nr; i++) { + if (sample.data_.ips[i] >= PERF_CONTEXT_MAX) { + i++; + continue; + } + if (i >= 1 && sample.data_.ips[i] >= 0x5) { + sample.data_.ips[i] -= 0x4; } } #endif -- Gitee From 9a6efc13bff7244d8ed7c909cde59b54b016c3d3 Mon Sep 17 00:00:00 2001 From: yuyanqinghw Date: Thu, 13 Mar 2025 11:53:55 +0800 Subject: [PATCH 5/5] adjust callchain pcs Signed-off-by: yuyanqinghw --- src/virtual_runtime.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/virtual_runtime.cpp b/src/virtual_runtime.cpp index 3d8fa4f..c362410 100644 --- a/src/virtual_runtime.cpp +++ b/src/virtual_runtime.cpp @@ -589,13 +589,15 @@ void VirtualRuntime::AdjustCallChain(PerfRecordSample &sample) if (!isHM_ || recordCallBack_ == nullptr) { return; } + constexpr uint64_t minValue = 0x5; + constexpr uint64_t offset = 0x4; for (u64 i = 0; i < sample.data_.nr; i++) { if (sample.data_.ips[i] >= PERF_CONTEXT_MAX) { i++; continue; } - if (i >= 1 && sample.data_.ips[i] >= 0x5) { - sample.data_.ips[i] -= 0x4; + if (i >= 1 && sample.data_.ips[i] >= minValue) { + sample.data_.ips[i] -= offset; } } #endif -- Gitee