From 173feba269c74f7518fcc4c318d971daee75bc4b Mon Sep 17 00:00:00 2001 From: buzhenwang Date: Sat, 6 Sep 2025 08:58:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BB=A3=E7=A0=81=20Signed-o?= =?UTF-8?q?ff-by:leiguangyu=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: buzhenwang --- include/subcommand_record.h | 3 +- src/subcommand_record.cpp | 34 ++++++++++++++----- .../common/native/subcommand_record_test.cpp | 8 ++--- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/include/subcommand_record.h b/include/subcommand_record.h index e405f27..d9d37f2 100644 --- a/include/subcommand_record.h +++ b/include/subcommand_record.h @@ -284,6 +284,8 @@ private: std::vector excludeProcessNameArgs_ = {}; std::set excludePids_ = {}; std::set excludeTids_ = {}; + std::unordered_set sensitiveServicePids_; + void CollectExcludeThread(); void SetExcludeHiperf(); bool IsThreadExcluded(const pid_t pid, const pid_t tid); @@ -375,7 +377,6 @@ private: const bool isRoot_ = IsRoot(); uint32_t offset_ = 0; - uint32_t devhostPid_ = UINT32_MAX; // callback to process record bool ProcessRecord(PerfEventRecord& record); diff --git a/src/subcommand_record.cpp b/src/subcommand_record.cpp index e0ed4e2..e585806 100644 --- a/src/subcommand_record.cpp +++ b/src/subcommand_record.cpp @@ -72,6 +72,14 @@ static constexpr uint64_t CHECK_WAIT_TIME_MS = 200; static constexpr uint32_t MAX_SERVER_OUTPUT_WAIT_COUNT = 600; static std::atomic_bool g_callStop(false); +static std::set SENSITIVE_SERVICE = { + DEVHOST_FILE_NAME, + "hguard.elf", + "crypto.elf", + "auditmgr.elf", + "devmgr.elf" +}; + int GetClockId(const std::string &name) { static std::map mapClockid = { @@ -2212,7 +2220,7 @@ void SubCommandRecord::CollectSymbol(PerfRecordSample *sample) } serverPid = sample->GetServerPidof(i); - if (!isRoot_ && static_cast(serverPid) == devhostPid_) { + if (!isRoot_ && sensitiveServicePids_.find(static_cast(serverPid)) != sensitiveServicePids_.end()) { // in func UpdateDevHostCallChains add offset_ to ips, need sub offset_ when symboling if (sample->data_.ips[i] > offset_) { sample->data_.ips[i] -= offset_; @@ -2378,15 +2386,23 @@ void SubCommandRecord::SetHM() const std::string basePath {"/proc/"}; std::vector subDirs = GetSubDirs(basePath); for (const auto &subDir : subDirs) { + if (sensitiveServicePids_.size() == SENSITIVE_SERVICE.size()) { + HIPERF_HILOGI(MODULE_DEFAULT, "sensitive service pid collect finish"); + break; + } if (!IsDigits(subDir)) { continue; } pid_t pid = std::stoll(subDir); std::string cmdline = GetProcessName(pid); - if (cmdline == "/bin/" + DEVHOST_FILE_NAME) { - virtualRuntime_.SetDevhostPid(pid); - devhostPid_ = static_cast(pid); - break; + for (const auto& service : SENSITIVE_SERVICE) { + if (cmdline == "/bin/" + service) { + if (service == DEVHOST_FILE_NAME) { + virtualRuntime_.SetDevhostPid(pid); + } + sensitiveServicePids_.insert(pid); + break; + } } } } @@ -2511,12 +2527,12 @@ void SubCommandRecord::UpdateDevHostMaps(PerfEventRecord& record) { if (record.GetType() == PERF_RECORD_MMAP) { auto recordMmap = static_cast(&record); - if (recordMmap->data_.pid == devhostPid_) { + if (sensitiveServicePids_.find(recordMmap->data_.pid) != sensitiveServicePids_.end()) { recordMmap->data_.addr += offset_; } } else if (record.GetType() == PERF_RECORD_MMAP2) { auto recordMmap2 = static_cast(&record); - if (recordMmap2->data_.pid == devhostPid_) { + if (sensitiveServicePids_.find(recordMmap2->data_.pid) != sensitiveServicePids_.end()) { recordMmap2->data_.addr += offset_; } } @@ -2529,7 +2545,7 @@ void SubCommandRecord::UpdateDevHostCallChains(PerfEventRecord& record) const uint64_t BAD_IP_ADDRESS = 2; auto sample = static_cast(&record); serverPid = static_cast(sample->GetServerPidof(0)); - if (serverPid == devhostPid_) { + if (sensitiveServicePids_.find(serverPid) != sensitiveServicePids_.end()) { sample->data_.ip += offset_; } for (u64 i = 0; i < sample->data_.nr; i++) { @@ -2537,7 +2553,7 @@ void SubCommandRecord::UpdateDevHostCallChains(PerfEventRecord& record) continue; } serverPid = static_cast(sample->GetServerPidof(i)); - if (serverPid == devhostPid_) { + if (sensitiveServicePids_.find(serverPid) != sensitiveServicePids_.end()) { sample->data_.ips[i] += offset_; } } diff --git a/test/unittest/common/native/subcommand_record_test.cpp b/test/unittest/common/native/subcommand_record_test.cpp index 32f6c87..d1232db 100644 --- a/test/unittest/common/native/subcommand_record_test.cpp +++ b/test/unittest/common/native/subcommand_record_test.cpp @@ -2475,7 +2475,7 @@ HWTEST_F(SubCommandRecordTest, UpdateDevHostMaps1, TestSize.Level1) PerfRecordMmap recordIn {true, pid, tid, addr, len, pgoff, "testdatammap"}; SubCommandRecord cmd; - cmd.devhostPid_ = pid; + cmd.sensitiveServicePids_.insert(pid); cmd.offset_ = cmd.GetOffsetNum(); cmd.UpdateDevHostMaps(recordIn); EXPECT_EQ(recordIn.data_.addr, cmd.offset_ + addr); @@ -2496,7 +2496,7 @@ HWTEST_F(SubCommandRecordTest, UpdateDevHostMaps2, TestSize.Level1) PerfRecordMmap recordIn {true, pid, tid, addr, len, pgoff, "testdatammap"}; SubCommandRecord cmd; - cmd.devhostPid_ = devhostPid; + cmd.sensitiveServicePids_.insert(devhostPid); cmd.offset_ = cmd.GetOffsetNum(); cmd.UpdateDevHostMaps(recordIn); EXPECT_EQ(recordIn.data_.addr, addr); @@ -2517,7 +2517,7 @@ HWTEST_F(SubCommandRecordTest, UpdateDevHostMaps3, TestSize.Level1) PerfRecordMmap2 recordIn {true, pid, tid, addr, len, pgoff, testNum, testNum, testNum, testNum, testNum, "testdatammap2"}; SubCommandRecord cmd; - cmd.devhostPid_ = pid; + cmd.sensitiveServicePids_.insert(pid); cmd.offset_ = cmd.GetOffsetNum(); cmd.UpdateDevHostMaps(recordIn); EXPECT_EQ(recordIn.data_.addr, cmd.offset_ + addr); @@ -2539,7 +2539,7 @@ HWTEST_F(SubCommandRecordTest, UpdateDevHostMaps4, TestSize.Level1) PerfRecordMmap2 recordIn {true, pid, tid, addr, len, pgoff, testNum, testNum, testNum, testNum, testNum, "testdatammap2"}; SubCommandRecord cmd; - cmd.devhostPid_ = devhostPid; + cmd.sensitiveServicePids_.insert(devhostPid); cmd.offset_ = cmd.GetOffsetNum(); cmd.UpdateDevHostMaps(recordIn); EXPECT_EQ(recordIn.data_.addr, addr); -- Gitee