From e88259fed01f2a9bc2972db7124e7a1bb38abd13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E4=B8=96=E7=90=A6=5Fhw?= <670097973@qq.com> Date: Fri, 12 Sep 2025 14:30:37 +0800 Subject: [PATCH] add gpu profiler interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 杨世琦_hw <670097973@qq.com> --- .../mem_profiler_collector_empty_impl.cpp | 5 +++ .../mem_profiler_collector_empty_impl.h | 1 + .../mem_profiler_collector_impl.cpp | 20 +++++++++ .../mem_profiler_collector_impl.h | 1 + .../include/mem_profiler_decorator.h | 1 + .../decorator/mem_profiler_decorator.cpp | 9 ++++ .../utility/mem_profiler_collector.h | 9 ++++ .../utility/mem_profiler_collector_test.cpp | 45 ++++++++++++++++++- 8 files changed, 89 insertions(+), 2 deletions(-) diff --git a/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.cpp b/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.cpp index d3b87ffe2..e7eb07830 100644 --- a/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.cpp +++ b/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.cpp @@ -28,6 +28,11 @@ int MemProfilerCollectorEmptyImpl::Start(const MemoryProfilerConfig& memoryProfi return RET_FAIL; } +int MemProfilerCollectorEmptyImpl::Start(int fd, pid_t pid, uint32_t duration, const MemConfig& memConfig) +{ + return RET_FAIL; +} + int MemProfilerCollectorEmptyImpl::StartPrintNmd(int fd, int pid, int type) { return RET_FAIL; diff --git a/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.h b/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.h index e2d9319ea..8c78136dd 100644 --- a/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.h +++ b/framework/native/unified_collection/collector/empty_impl/mem_profiler/mem_profiler_collector_empty_impl.h @@ -24,6 +24,7 @@ namespace UCollectUtil { class MemProfilerCollectorEmptyImpl : public MemProfilerCollector { public: int Start(const MemoryProfilerConfig& memoryProfilerConfig) override; + int Start(int fd, pid_t pid, uint32_t duration, const MemConfig& memConfig) override; int StartPrintNmd(int fd, int pid, int type) override; int Stop(int pid) override; int Stop(const std::string& processName) override; diff --git a/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.cpp b/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.cpp index 15b00cd28..afbb4c7f2 100644 --- a/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.cpp +++ b/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.cpp @@ -110,6 +110,26 @@ int MemProfilerCollectorImpl::Start(const MemoryProfilerConfig& memoryProfilerCo memoryProfilerConfig.duration, memoryProfilerConfig.sampleInterval); } +int MemProfilerCollectorImpl::Start(int fd, pid_t pid, uint32_t duration, const MemConfig& memConfig) +{ + if (int res = StartNativeDaemon(); res != RET_SUCC) { + return res; + } + HIVIEW_LOGI("mem_profiler_collector starting"); + if (GetUid(pid) >= APP_THRESH) { + auto client = DelayedSingleton::GetInstance(); + if (client == nullptr) { + HIVIEW_LOGE("AppMgrClient is nullptr"); + } else { + client->SetAppFreezeFilter(pid); + } + } + MemSaConfig saConfig; + saConfig.mask = memConfig.mask; + saConfig.hookSizes = memConfig.hookSizes; + return NativeMemoryProfilerSaClientManager::Start(fd, pid, duration, saConfig); +} + int MemProfilerCollectorImpl::StartPrintNmd(int fd, int pid, int type) { if (int res = StartNativeDaemon(); res != RET_SUCC) { diff --git a/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.h b/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.h index b51dd3929..d080511f7 100644 --- a/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.h +++ b/framework/native/unified_collection/collector/impl/mem_profiler/mem_profiler_collector_impl.h @@ -28,6 +28,7 @@ public: public: int Start(const MemoryProfilerConfig& memoryProfilerConfig) override; + int Start(int fd, pid_t pid, uint32_t duration, const MemConfig& memConfig) override; int StartPrintNmd(int fd, int pid, int type) override; int Stop(int pid) override; int Stop(const std::string& processName) override; diff --git a/framework/native/unified_collection/decorator/include/mem_profiler_decorator.h b/framework/native/unified_collection/decorator/include/mem_profiler_decorator.h index 85da96248..f0a2ed416 100644 --- a/framework/native/unified_collection/decorator/include/mem_profiler_decorator.h +++ b/framework/native/unified_collection/decorator/include/mem_profiler_decorator.h @@ -27,6 +27,7 @@ public: MemProfilerDecorator(std::shared_ptr collector) : memProfilerCollector_(collector) {}; virtual ~MemProfilerDecorator() = default; int Start(const MemoryProfilerConfig& memoryProfilerConfig) override; + int Start(int fd, pid_t pid, uint32_t duration, const MemConfig& memConfig) override; int Stop(int pid) override; int Stop(const std::string& processName) override; int Start(int fd, const MemoryProfilerConfig& memoryProfilerConfig) override; diff --git a/framework/native/unified_collection/decorator/mem_profiler_decorator.cpp b/framework/native/unified_collection/decorator/mem_profiler_decorator.cpp index 153db0549..7ab55791f 100644 --- a/framework/native/unified_collection/decorator/mem_profiler_decorator.cpp +++ b/framework/native/unified_collection/decorator/mem_profiler_decorator.cpp @@ -37,6 +37,15 @@ int MemProfilerDecorator::Start(const MemoryProfilerConfig& memoryProfilerConfig return Invoke(task, statInfoWrapper_, std::string(MEM_PROFILER_COLLECTOR_NAME) + UC_SEPARATOR + __func__ + "-1"); } +int MemProfilerDecorator::Start(int fd, pid_t pid, uint32_t duration, const MemConfig& memConfig) +{ + auto task = [this, &fd, &pid, &duration, &memConfig] { + return memProfilerCollector_->Start(fd, pid, duration, memConfig); + }; + // has same func name, rename it with num "-5" + return Invoke(task, statInfoWrapper_, std::string(MEM_PROFILER_COLLECTOR_NAME) + UC_SEPARATOR + __func__ + "-5"); +} + int MemProfilerDecorator::Stop(int pid) { auto task = [this, &pid] { return memProfilerCollector_->Stop(pid); }; diff --git a/interfaces/inner_api/unified_collection/utility/mem_profiler_collector.h b/interfaces/inner_api/unified_collection/utility/mem_profiler_collector.h index f836c4a7a..8decf1da4 100644 --- a/interfaces/inner_api/unified_collection/utility/mem_profiler_collector.h +++ b/interfaces/inner_api/unified_collection/utility/mem_profiler_collector.h @@ -15,6 +15,7 @@ #ifndef INTERFACES_INNER_API_UNIFIED_COLLECTION_UTILITY_MEM_PROFILER_COLLECTOR_H #define INTERFACES_INNER_API_UNIFIED_COLLECTION_UTILITY_MEM_PROFILER_COLLECTOR_H #include +#include #include "collect_result.h" #include "native_memory_profiler_sa_client_manager.h" @@ -46,6 +47,13 @@ struct SimplifiedMemConfig { size_t sampleSize = 0; }; +using Range = std::pair; + +struct MemConfig { + uint64_t mask = 0; + std::map> hookSizes; +}; + class MemProfilerCollector { public: MemProfilerCollector() = default; @@ -53,6 +61,7 @@ public: public: virtual int Start(const MemoryProfilerConfig& memoryProfilerConfig) = 0; + virtual int Start(int fd, pid_t pid, uint32_t duration, const MemConfig& memConfig) = 0; virtual int StartPrintNmd(int fd, int pid, int type) = 0; virtual int Stop(int pid) = 0; virtual int Stop(const std::string& processName) = 0; diff --git a/test/unittest/unified_collection/utility/mem_profiler_collector_test.cpp b/test/unittest/unified_collection/utility/mem_profiler_collector_test.cpp index e07003e31..0966381b4 100644 --- a/test/unittest/unified_collection/utility/mem_profiler_collector_test.cpp +++ b/test/unittest/unified_collection/utility/mem_profiler_collector_test.cpp @@ -12,12 +12,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include +#include +#include +#include +#include #include + #include "common.h" +#include "common_utils.h" +#include "file_util.h" #include "mem_profiler_collector.h" #include "native_memory_profiler_sa_client_manager.h" -#include -#include + using namespace testing::ext; using namespace OHOS::HiviewDFX; @@ -230,4 +237,38 @@ HWTEST_F(MemProfilerCollectorTest, MemProfilerCollectorTest006, TestSize.Level1) } ASSERT_TRUE(time < FINAL_TIME); std::this_thread::sleep_for(std::chrono::milliseconds(EXIT_TIME)); +} + +/** + * @tc.name: MemProfilerCollectorTest007 + * @tc.desc: used to test MemProfilerCollector.Start + * @tc.type: FUNC +*/ +HWTEST_F(MemProfilerCollectorTest, MemProfilerCollectorTest007, TestSize.Level1) +{ + std::shared_ptr collector = MemProfilerCollector::Create(); + collector->Prepare(); + MemConfig memConfig = { + .mask = 0xFFFF, + .hookSizes = { + {"RES_GPU_VK", {{0, 100}, {0, 20}}}, + {"RES_GPU_GLES_IMAGE", {{0, 101}, {0, 21}}}, + {"RES_GPU_GLES_BUFFER", {{0, 102}, {0, 22}}}, + {"RES_GPU_CL_IMAGE", {{0, 103}, {0, 23}}}, + {"RES_GPU_CL_BUFFER", {{0, 104}, {0, 24}}}, + } + }; + + auto fd = open("/data/test/profiler_file", O_CREAT | O_RDWR, 0664); + ASSERT_FALSE(fd < 0); + const std::string systemuiProcName = "com.ohos.systemui"; + const std::string sceneBoardProcName = "com.ohos.sceneboard"; + auto systemuiPid = CommonUtils::GetPidByName(systemuiProcName); + auto launcherPid = CommonUtils::GetPidByName(sceneBoardProcName); + auto pid = static_cast(systemuiPid > 0 ? systemuiPid : launcherPid); + int ret = collector->Start(fd, pid, 10, memConfig); + + // Permission deny, if the invoker is not hiview + ASSERT_NE(ret, 0); + close(fd); } \ No newline at end of file -- Gitee