mirror of
https://gitee.com/openharmony/developtools_profiler
synced 2024-11-30 10:31:07 +00:00
Merge branch 'master' of https://gitee.com/harrysunv9x/developtools_profiler_new
This commit is contained in:
commit
a46c2a3ba2
@ -72,6 +72,7 @@ group("unittest") {
|
|||||||
"plugins/hisysevent_plugin/test:unittest",
|
"plugins/hisysevent_plugin/test:unittest",
|
||||||
"plugins/memory_plugin/test:unittest",
|
"plugins/memory_plugin/test:unittest",
|
||||||
"plugins/network_plugin/test:unittest",
|
"plugins/network_plugin/test:unittest",
|
||||||
|
"plugins/network_profiler/test:unittest",
|
||||||
"plugins/process_plugin/test:unittest",
|
"plugins/process_plugin/test:unittest",
|
||||||
"plugins/xpower_plugin/test:unittest",
|
"plugins/xpower_plugin/test:unittest",
|
||||||
"services/ipc/test:unittest",
|
"services/ipc/test:unittest",
|
||||||
|
@ -368,6 +368,35 @@ public:
|
|||||||
return cmdStr;
|
return cmdStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CreateSplitNetworkProfilerCommand(const std::string &outFile, int time) const
|
||||||
|
{
|
||||||
|
std::string cmdStr =
|
||||||
|
"hiprofiler_cmd -s -k \\\n"
|
||||||
|
"-c - \\\n";
|
||||||
|
cmdStr += "-o " + outFile + " \\\n";
|
||||||
|
cmdStr += "-t " + std::to_string(time) + " \\\n"
|
||||||
|
"<<CONFIG\n"
|
||||||
|
"request_id: 1\n"
|
||||||
|
"session_config {\n"
|
||||||
|
" buffers {\n"
|
||||||
|
" pages: 16384\n"
|
||||||
|
" }\n"
|
||||||
|
" split_file: true\n"
|
||||||
|
"}\n"
|
||||||
|
"plugin_configs {\n"
|
||||||
|
" plugin_name: \"network-profiler\"\n"
|
||||||
|
" config_data {\n"
|
||||||
|
" clock_id: 1\n"
|
||||||
|
" smb_pages: 16384\n"
|
||||||
|
" startup_process_name: \"com.ohos.systemui\"\n"
|
||||||
|
" block: true\n"
|
||||||
|
" flush_interval: 5\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n"
|
||||||
|
"CONFIG\n";
|
||||||
|
return cmdStr;
|
||||||
|
}
|
||||||
|
|
||||||
std::string CreateSplitHiperfCommand(const std::string &outFile, const std::string &perfFile,
|
std::string CreateSplitHiperfCommand(const std::string &outFile, const std::string &perfFile,
|
||||||
const std::string &perfSplitFile, int time) const
|
const std::string &perfSplitFile, int time) const
|
||||||
{
|
{
|
||||||
@ -817,3 +846,27 @@ HWTEST_F(HiprofilerCmdTest, DFX_DFR_Hiprofiler_0230, Function | MediumTest | Lev
|
|||||||
system(cmd.c_str());
|
system(cmd.c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: hiprofiler_cmd
|
||||||
|
* @tc.desc: Test hiprofiler_cmd with split hiebpf file.
|
||||||
|
* @tc.type: FUNC
|
||||||
|
*/
|
||||||
|
HWTEST_F(HiprofilerCmdTest, DFX_DFR_Hiprofiler_0240, Function | MediumTest | Level1)
|
||||||
|
{
|
||||||
|
std::string outFileName = "split_htrace";
|
||||||
|
std::string outFile = DEFAULT_PATH + outFileName + ".htrace";
|
||||||
|
std::string content = "";
|
||||||
|
int time = 10;
|
||||||
|
std::string cmd = CreateSplitNetworkProfilerCommand(outFile, time);
|
||||||
|
EXPECT_TRUE(RunCommand(cmd, content));
|
||||||
|
|
||||||
|
EXPECT_NE(access(outFile.c_str(), F_OK), 0);
|
||||||
|
|
||||||
|
cmd = "ls " + DEFAULT_PATH + outFileName + "*_1.htrace";
|
||||||
|
EXPECT_TRUE(RunCommand(cmd, content));
|
||||||
|
EXPECT_STRNE(content.c_str(), "");
|
||||||
|
|
||||||
|
cmd = "rm " + DEFAULT_PATH + outFileName + "*.htrace";
|
||||||
|
system(cmd.c_str());
|
||||||
|
}
|
||||||
|
@ -24,6 +24,7 @@ sources_base = [
|
|||||||
"unittest/common/native/hook_manager_test.cpp",
|
"unittest/common/native/hook_manager_test.cpp",
|
||||||
"unittest/common/native/hook_service_test.cpp",
|
"unittest/common/native/hook_service_test.cpp",
|
||||||
"unittest/common/native/register_test.cpp",
|
"unittest/common/native/register_test.cpp",
|
||||||
|
"unittest/common/native/stack_preprocess_test.cpp",
|
||||||
"unittest/common/native/symbols_file_test.cpp",
|
"unittest/common/native/symbols_file_test.cpp",
|
||||||
"unittest/common/native/utilities_test.cpp",
|
"unittest/common/native/utilities_test.cpp",
|
||||||
"unittest/common/native/virtual_thread_test.cpp",
|
"unittest/common/native/virtual_thread_test.cpp",
|
||||||
|
@ -0,0 +1,109 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include "stack_preprocess.h"
|
||||||
|
#include "native_hook_config.pb.h"
|
||||||
|
#include "plugin_module_api.h"
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace testing::ext;
|
||||||
|
using namespace OHOS::Developtools::NativeDaemon;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
constexpr static uint32_t MAX_MATCH_INTERVAL = 3600;
|
||||||
|
constexpr static uint32_t MAX_MATCH_CNT = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
class StackPreprocessTest : public testing::Test {
|
||||||
|
public:
|
||||||
|
static void SetUpTestCase(void);
|
||||||
|
static void TearDownTestCase(void);
|
||||||
|
void SetUp();
|
||||||
|
void TearDown();
|
||||||
|
};
|
||||||
|
void StackPreprocessTest::SetUpTestCase(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void StackPreprocessTest::TearDownTestCase(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void StackPreprocessTest::SetUp(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void StackPreprocessTest::TearDown(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
long WriteFunc(WriterStruct* writer, const void* data, size_t size)
|
||||||
|
{
|
||||||
|
if (writer == nullptr || data == nullptr || size <= 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FlushFunc(WriterStruct* writer)
|
||||||
|
{
|
||||||
|
if (writer == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@tc.name: StackPreprocessTest001
|
||||||
|
@tc.desc: test StackPreprocess with overcceeding max matching interval.
|
||||||
|
@tc.type: FUNC
|
||||||
|
*/
|
||||||
|
HWTEST_F(StackPreprocessTest, StackPreprocessTest001, TestSize.Level1)
|
||||||
|
{
|
||||||
|
NativeHookConfig hookConfig;
|
||||||
|
hookConfig.set_malloc_free_matching_interval(MAX_MATCH_INTERVAL + 1);
|
||||||
|
StackPreprocess preprocess(nullptr, hookConfig, 0);
|
||||||
|
ASSERT_TRUE(preprocess.hookConfig_.malloc_free_matching_interval() == MAX_MATCH_INTERVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@tc.name: StackPreprocessTest002
|
||||||
|
@tc.desc: test StackPreprocess with overcceeding max matching cnt.
|
||||||
|
@tc.type: FUNC
|
||||||
|
*/
|
||||||
|
HWTEST_F(StackPreprocessTest, StackPreprocessTest002, TestSize.Level1)
|
||||||
|
{
|
||||||
|
NativeHookConfig hookConfig;
|
||||||
|
hookConfig.set_malloc_free_matching_cnt(MAX_MATCH_CNT + 1);
|
||||||
|
StackPreprocess preprocess(nullptr, hookConfig, 0);
|
||||||
|
ASSERT_TRUE(preprocess.hookConfig_.malloc_free_matching_cnt() == MAX_MATCH_CNT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@tc.name: StackPreprocessTest003
|
||||||
|
@tc.desc: test StackPreprocess with save_file set to true but no file pointer provided.
|
||||||
|
@tc.type: FUNC
|
||||||
|
*/
|
||||||
|
HWTEST_F(StackPreprocessTest, StackPreprocessTest003, TestSize.Level1)
|
||||||
|
{
|
||||||
|
NativeHookConfig hookConfig;
|
||||||
|
hookConfig.set_save_file(true);
|
||||||
|
FILE* fpHookData = nullptr;
|
||||||
|
StackPreprocess preprocess(nullptr, hookConfig, 0, fpHookData);
|
||||||
|
ASSERT_TRUE(hookConfig.save_file() && fpHookData == nullptr);
|
||||||
|
}
|
@ -245,6 +245,7 @@ void* MallocHookStart(void* disableHookCallback)
|
|||||||
COMMON::PrintMallinfoLog("before hook(byte) => ", g_miStart);
|
COMMON::PrintMallinfoLog("before hook(byte) => ", g_miStart);
|
||||||
g_mallocTimes = 0;
|
g_mallocTimes = 0;
|
||||||
g_hookClient.reset();
|
g_hookClient.reset();
|
||||||
|
GetMainThreadRuntimeStackRange(g_filterStaLibRange);
|
||||||
if (g_hookClient != nullptr) {
|
if (g_hookClient != nullptr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
} else {
|
} else {
|
||||||
@ -271,7 +272,6 @@ bool ohos_malloc_hook_on_start(void (*disableHookCallback)())
|
|||||||
pthread_setspecific(g_hookTid, nullptr);
|
pthread_setspecific(g_hookTid, nullptr);
|
||||||
pthread_key_create(&g_updateThreadNameCount, nullptr);
|
pthread_key_create(&g_updateThreadNameCount, nullptr);
|
||||||
pthread_setspecific(g_updateThreadNameCount, reinterpret_cast<void *>(0));
|
pthread_setspecific(g_updateThreadNameCount, reinterpret_cast<void *>(0));
|
||||||
GetMainThreadRuntimeStackRange(g_filterStaLibRange);
|
|
||||||
constexpr int paramBufferLen = 128;
|
constexpr int paramBufferLen = 128;
|
||||||
char paramOutBuf[paramBufferLen] = {0};
|
char paramOutBuf[paramBufferLen] = {0};
|
||||||
int ret = GetParameter("persist.hiviewdfx.profiler.mem.filter", "", paramOutBuf, paramBufferLen);
|
int ret = GetParameter("persist.hiviewdfx.profiler.mem.filter", "", paramOutBuf, paramBufferLen);
|
||||||
@ -632,6 +632,11 @@ void* hook_calloc(void* (*fn)(size_t, size_t), size_t number, size_t size)
|
|||||||
#endif
|
#endif
|
||||||
return pRet;
|
return pRet;
|
||||||
}
|
}
|
||||||
|
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
||||||
|
auto holder = weakClient.lock();
|
||||||
|
if (holder == nullptr) {
|
||||||
|
return pRet;
|
||||||
|
}
|
||||||
StackRawData rawdata = {{{{0}}}};
|
StackRawData rawdata = {{{{0}}}};
|
||||||
const char* stackptr = nullptr;
|
const char* stackptr = nullptr;
|
||||||
const char* stackendptr = nullptr;
|
const char* stackendptr = nullptr;
|
||||||
@ -675,17 +680,13 @@ void* hook_calloc(void* (*fn)(size_t, size_t), size_t number, size_t size)
|
|||||||
if (g_ClientConfig.sampleInterval >= THRESHOLD) {
|
if (g_ClientConfig.sampleInterval >= THRESHOLD) {
|
||||||
Addr2Bitpool(pRet);
|
Addr2Bitpool(pRet);
|
||||||
}
|
}
|
||||||
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
int realSize = 0;
|
||||||
auto holder = weakClient.lock();
|
if (g_ClientConfig.fpunwind) {
|
||||||
if (holder != nullptr) {
|
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
||||||
int realSize = 0;
|
} else {
|
||||||
if (g_ClientConfig.fpunwind) {
|
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
||||||
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
|
||||||
} else {
|
|
||||||
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
|
||||||
}
|
|
||||||
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
|
||||||
}
|
}
|
||||||
|
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
||||||
g_mallocTimes++;
|
g_mallocTimes++;
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
struct timespec end = {};
|
struct timespec end = {};
|
||||||
@ -741,6 +742,11 @@ void* hook_realloc(void* (*fn)(void*, size_t), void* ptr, size_t size)
|
|||||||
#endif
|
#endif
|
||||||
return pRet;
|
return pRet;
|
||||||
}
|
}
|
||||||
|
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
||||||
|
auto holder = weakClient.lock();
|
||||||
|
if (holder == nullptr) {
|
||||||
|
return pRet;
|
||||||
|
}
|
||||||
StackRawData rawdata = {{{{0}}}};
|
StackRawData rawdata = {{{{0}}}};
|
||||||
StackRawData freeData = {{{{0}}}};
|
StackRawData freeData = {{{{0}}}};
|
||||||
const char* stackptr = nullptr;
|
const char* stackptr = nullptr;
|
||||||
@ -792,27 +798,23 @@ void* hook_realloc(void* (*fn)(void*, size_t), void* ptr, size_t size)
|
|||||||
if (g_ClientConfig.sampleInterval >= THRESHOLD) {
|
if (g_ClientConfig.sampleInterval >= THRESHOLD) {
|
||||||
Addr2Bitpool(pRet);
|
Addr2Bitpool(pRet);
|
||||||
}
|
}
|
||||||
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
int realSize = 0;
|
||||||
auto holder = weakClient.lock();
|
int freeRealSize = 0;
|
||||||
if (holder != nullptr) {
|
freeData.type = FREE_MSG;
|
||||||
int realSize = 0;
|
freeData.pid = rawdata.pid;
|
||||||
int freeRealSize = 0;
|
freeData.tid = rawdata.tid;
|
||||||
freeData.type = FREE_MSG;
|
freeData.mallocSize = 0;
|
||||||
freeData.pid = rawdata.pid;
|
freeData.addr = ptr;
|
||||||
freeData.tid = rawdata.tid;
|
freeData.ts = rawdata.ts;
|
||||||
freeData.mallocSize = 0;
|
if (g_ClientConfig.fpunwind) {
|
||||||
freeData.addr = ptr;
|
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
||||||
freeData.ts = rawdata.ts;
|
freeRealSize = sizeof(BaseStackRawData);
|
||||||
if (g_ClientConfig.fpunwind) {
|
} else {
|
||||||
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
||||||
freeRealSize = sizeof(BaseStackRawData);
|
freeRealSize = realSize;
|
||||||
} else {
|
|
||||||
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
|
||||||
freeRealSize = realSize;
|
|
||||||
}
|
|
||||||
holder->SendStackWithPayload(&freeData, freeRealSize, nullptr, 0); // 0: Don't unwind the freeData
|
|
||||||
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
|
||||||
}
|
}
|
||||||
|
holder->SendStackWithPayload(&freeData, freeRealSize, nullptr, 0); // 0: Don't unwind the freeData
|
||||||
|
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
g_mallocTimes++;
|
g_mallocTimes++;
|
||||||
struct timespec end = {};
|
struct timespec end = {};
|
||||||
@ -889,6 +891,11 @@ void hook_free(void (*free_func)(void*), void* p)
|
|||||||
struct timespec start = {};
|
struct timespec start = {};
|
||||||
clock_gettime(CLOCK_REALTIME, &start);
|
clock_gettime(CLOCK_REALTIME, &start);
|
||||||
#endif
|
#endif
|
||||||
|
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
||||||
|
auto holder = weakClient.lock();
|
||||||
|
if (holder == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
StackRawData rawdata = {{{{0}}}};
|
StackRawData rawdata = {{{{0}}}};
|
||||||
const char* stackptr = nullptr;
|
const char* stackptr = nullptr;
|
||||||
const char* stackendptr = nullptr;
|
const char* stackendptr = nullptr;
|
||||||
@ -931,17 +938,13 @@ void hook_free(void (*free_func)(void*), void* p)
|
|||||||
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
||||||
rawdata.mallocSize = 0;
|
rawdata.mallocSize = 0;
|
||||||
rawdata.addr = p;
|
rawdata.addr = p;
|
||||||
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
int realSize = 0;
|
||||||
auto holder = weakClient.lock();
|
if (g_ClientConfig.fpunwind) {
|
||||||
if (holder != nullptr) {
|
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
||||||
int realSize = 0;
|
} else {
|
||||||
if (g_ClientConfig.fpunwind) {
|
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
||||||
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
|
||||||
} else {
|
|
||||||
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
|
||||||
}
|
|
||||||
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
|
||||||
}
|
}
|
||||||
|
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
g_mallocTimes++;
|
g_mallocTimes++;
|
||||||
struct timespec end = {};
|
struct timespec end = {};
|
||||||
@ -1008,6 +1011,11 @@ void* hook_mmap(void*(*fn)(void*, size_t, int, int, int, off_t),
|
|||||||
#endif
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
||||||
|
auto holder = weakClient.lock();
|
||||||
|
if (holder == nullptr) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
StackRawData rawdata = {{{{0}}}};
|
StackRawData rawdata = {{{{0}}}};
|
||||||
const char* stackptr = nullptr;
|
const char* stackptr = nullptr;
|
||||||
const char* stackendptr = nullptr;
|
const char* stackendptr = nullptr;
|
||||||
@ -1048,11 +1056,6 @@ void* hook_mmap(void*(*fn)(void*, size_t, int, int, int, off_t),
|
|||||||
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
||||||
rawdata.mallocSize = length;
|
rawdata.mallocSize = length;
|
||||||
rawdata.addr = ret;
|
rawdata.addr = ret;
|
||||||
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
|
||||||
auto holder = weakClient.lock();
|
|
||||||
if (holder == nullptr) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
if (fd >= 0) {
|
if (fd >= 0) {
|
||||||
rawdata.type = MMAP_FILE_PAGE_MSG;
|
rawdata.type = MMAP_FILE_PAGE_MSG;
|
||||||
char path[FD_PATH_LENGTH] = {0};
|
char path[FD_PATH_LENGTH] = {0};
|
||||||
@ -1105,13 +1108,17 @@ int hook_munmap(int(*fn)(void*, size_t), void* addr, size_t length)
|
|||||||
if (g_ClientConfig.mmapDisable || IsPidChanged()) {
|
if (g_ClientConfig.mmapDisable || IsPidChanged()) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
struct timespec start = {};
|
struct timespec start = {};
|
||||||
clock_gettime(CLOCK_REALTIME, &start);
|
clock_gettime(CLOCK_REALTIME, &start);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int stackSize = 0;
|
int stackSize = 0;
|
||||||
|
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
||||||
|
auto holder = weakClient.lock();
|
||||||
|
if (holder == nullptr) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
StackRawData rawdata = {{{{0}}}};
|
StackRawData rawdata = {{{{0}}}};
|
||||||
const char* stackptr = nullptr;
|
const char* stackptr = nullptr;
|
||||||
const char* stackendptr = nullptr;
|
const char* stackendptr = nullptr;
|
||||||
@ -1152,17 +1159,13 @@ int hook_munmap(int(*fn)(void*, size_t), void* addr, size_t length)
|
|||||||
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
||||||
rawdata.mallocSize = length;
|
rawdata.mallocSize = length;
|
||||||
rawdata.addr = addr;
|
rawdata.addr = addr;
|
||||||
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
int realSize = 0;
|
||||||
auto holder = weakClient.lock();
|
if (g_ClientConfig.fpunwind) {
|
||||||
if (holder != nullptr) {
|
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
||||||
int realSize = 0;
|
} else {
|
||||||
if (g_ClientConfig.fpunwind) {
|
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
||||||
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
|
||||||
} else {
|
|
||||||
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
|
||||||
}
|
|
||||||
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
|
||||||
}
|
}
|
||||||
|
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
g_mallocTimes++;
|
g_mallocTimes++;
|
||||||
struct timespec end = {};
|
struct timespec end = {};
|
||||||
@ -1187,6 +1190,11 @@ int hook_prctl(int(*fn)(int, ...),
|
|||||||
if (reinterpret_cast<char*>(arg5) == nullptr || IsPidChanged()) {
|
if (reinterpret_cast<char*>(arg5) == nullptr || IsPidChanged()) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
||||||
|
auto holder = weakClient.lock();
|
||||||
|
if (holder == nullptr) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
if (option == PR_SET_VMA && arg2 == PR_SET_VMA_ANON_NAME) {
|
if (option == PR_SET_VMA && arg2 == PR_SET_VMA_ANON_NAME) {
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
struct timespec start = {};
|
struct timespec start = {};
|
||||||
@ -1204,11 +1212,7 @@ int hook_prctl(int(*fn)(int, ...),
|
|||||||
HILOG_BASE_ERROR(LOG_CORE, "memcpy_s tag failed");
|
HILOG_BASE_ERROR(LOG_CORE, "memcpy_s tag failed");
|
||||||
}
|
}
|
||||||
rawdata.name[sizeof(rawdata.name) - 1] = '\0';
|
rawdata.name[sizeof(rawdata.name) - 1] = '\0';
|
||||||
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
holder->SendStackWithPayload(&rawdata, sizeof(BaseStackRawData) + tagLen, nullptr, 0);
|
||||||
auto holder = weakClient.lock();
|
|
||||||
if (holder != nullptr) {
|
|
||||||
holder->SendStackWithPayload(&rawdata, sizeof(BaseStackRawData) + tagLen, nullptr, 0);
|
|
||||||
}
|
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
g_mallocTimes++;
|
g_mallocTimes++;
|
||||||
struct timespec end = {};
|
struct timespec end = {};
|
||||||
@ -1233,6 +1237,11 @@ void hook_memtrace(void* addr, size_t size, const char* tag, bool isUsing)
|
|||||||
struct timespec start = {};
|
struct timespec start = {};
|
||||||
clock_gettime(CLOCK_REALTIME, &start);
|
clock_gettime(CLOCK_REALTIME, &start);
|
||||||
#endif
|
#endif
|
||||||
|
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
||||||
|
auto holder = weakClient.lock();
|
||||||
|
if (holder == nullptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
int stackSize = 0;
|
int stackSize = 0;
|
||||||
StackRawData rawdata = {{{{0}}}};
|
StackRawData rawdata = {{{{0}}}};
|
||||||
const char* stackptr = nullptr;
|
const char* stackptr = nullptr;
|
||||||
@ -1274,18 +1283,14 @@ void hook_memtrace(void* addr, size_t size, const char* tag, bool isUsing)
|
|||||||
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
rawdata.tid = static_cast<uint32_t>(GetCurThreadId());
|
||||||
rawdata.mallocSize = size;
|
rawdata.mallocSize = size;
|
||||||
rawdata.addr = addr;
|
rawdata.addr = addr;
|
||||||
std::weak_ptr<HookSocketClient> weakClient = g_hookClient;
|
|
||||||
auto holder = weakClient.lock();
|
|
||||||
rawdata.tagId = isUsing ? GetTagId(holder, tag) : 0;
|
rawdata.tagId = isUsing ? GetTagId(holder, tag) : 0;
|
||||||
if (holder != nullptr) {
|
int realSize = 0;
|
||||||
int realSize = 0;
|
if (g_ClientConfig.fpunwind) {
|
||||||
if (g_ClientConfig.fpunwind) {
|
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
||||||
realSize = sizeof(BaseStackRawData) + (fpStackDepth * sizeof(uint64_t));
|
} else {
|
||||||
} else {
|
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
||||||
realSize = sizeof(BaseStackRawData) + sizeof(rawdata.regs);
|
|
||||||
}
|
|
||||||
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
|
||||||
}
|
}
|
||||||
|
holder->SendStackWithPayload(&rawdata, realSize, stackptr, stackSize);
|
||||||
#ifdef PERFORMANCE_DEBUG
|
#ifdef PERFORMANCE_DEBUG
|
||||||
g_mallocTimes++;
|
g_mallocTimes++;
|
||||||
struct timespec end = {};
|
struct timespec end = {};
|
||||||
|
87
device/plugins/network_profiler/test/BUILD.gn
Normal file
87
device/plugins/network_profiler/test/BUILD.gn
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
# Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved.
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
import("//build/test.gni")
|
||||||
|
import("../../../base/config.gni")
|
||||||
|
|
||||||
|
module_output_path = "${OHOS_PROFILER_TEST_MODULE_OUTPUT_PATH}/device"
|
||||||
|
network_profiler_path = "${OHOS_PROFILER_DIR}/device/plugins/network_profiler"
|
||||||
|
|
||||||
|
ohos_unittest("networkprofiler_ut") {
|
||||||
|
module_out_path = module_output_path
|
||||||
|
|
||||||
|
sources = [
|
||||||
|
"${network_profiler_path}/client/src/network_profiler.cpp",
|
||||||
|
"${network_profiler_path}/client/src/network_profiler_socker_client.cpp",
|
||||||
|
"${network_profiler_path}/client/src/network_profiler_write.cpp",
|
||||||
|
"unittest/network_profiler_test.cpp",
|
||||||
|
]
|
||||||
|
|
||||||
|
deps = [
|
||||||
|
"${OHOS_PROFILER_DIR}/device/plugins/api:plugins_sources",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/plugins/network_profiler/service:network_profiler_service",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/services/plugin_service:hiprofiler_plugin_service",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/services/profiler_service:profiler_service",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/services/shared_memory:shared_memory_lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
external_deps = [
|
||||||
|
"abseil-cpp:absl_sync",
|
||||||
|
"bounds_checking_function:libsec_shared",
|
||||||
|
"googletest:gtest",
|
||||||
|
"grpc:grpc",
|
||||||
|
"grpc:grpcxx",
|
||||||
|
"hilog:libhilog_base",
|
||||||
|
"protobuf:protobuf_lite",
|
||||||
|
]
|
||||||
|
|
||||||
|
external_deps += [
|
||||||
|
"bounds_checking_function:libsec_shared",
|
||||||
|
"init:libbegetutil",
|
||||||
|
"openssl:libcrypto_shared",
|
||||||
|
]
|
||||||
|
|
||||||
|
defines = []
|
||||||
|
if (current_toolchain != host_toolchain) {
|
||||||
|
external_deps += [ "hilog:libhilog_base" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
include_dirs = [
|
||||||
|
"${network_profiler_path}/client/include",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/plugins/api/include",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/plugins/api/src",
|
||||||
|
"${OHOS_PROFILER_DIR}/interfaces/kits",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/base/include",
|
||||||
|
]
|
||||||
|
include_dirs += [
|
||||||
|
"${OHOS_PROFILER_DIR}/device/plugins/network_profiler/service/include",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/services/ipc/include",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/services/shared_memory/include",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/services/plugin_service/include",
|
||||||
|
"${OHOS_PROFILER_DIR}/interfaces/kits",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/plugins/api/include",
|
||||||
|
"${OHOS_PROFILER_DIR}/device/base/include",
|
||||||
|
]
|
||||||
|
cflags = [
|
||||||
|
"-Wno-inconsistent-missing-override",
|
||||||
|
"-Dprivate=public", #allow test code access private members
|
||||||
|
"-Dprotected=public", #allow test code access private members
|
||||||
|
]
|
||||||
|
|
||||||
|
subsystem_name = "${OHOS_PROFILER_SUBSYS_NAME}"
|
||||||
|
}
|
||||||
|
|
||||||
|
group("unittest") {
|
||||||
|
testonly = true
|
||||||
|
deps = [ ":networkprofiler_ut" ]
|
||||||
|
}
|
@ -0,0 +1,96 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Huawei Technologies Co., Ltd. 2021. All rights reserved.
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <thread>
|
||||||
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "init_param.h"
|
||||||
|
#include "network_profiler_socker_client.h"
|
||||||
|
#include "network_profiler.h"
|
||||||
|
#include "network_profiler_manager.h"
|
||||||
|
#include "grpc/impl/codegen/log.h"
|
||||||
|
#include "plugin_service.h"
|
||||||
|
#include "plugin_service.ipc.h"
|
||||||
|
#include "socket_context.h"
|
||||||
|
#include "network_profiler_config.pb.h"
|
||||||
|
|
||||||
|
using namespace testing::ext;
|
||||||
|
using namespace OHOS::Developtools::Profiler;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
const std::string PARAM_KAY = "hiviewdfx.hiprofiler.networkprofiler.target";
|
||||||
|
class NetworkProfilerTest : public ::testing::Test {
|
||||||
|
public:
|
||||||
|
static void SetUpTestCase()
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
static void TearDownTestCase()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
void SetUp() {}
|
||||||
|
void TearDown() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
void CallBackFunc()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: network profiler test
|
||||||
|
* @tc.desc: Test NetworkProfilerSocketClient IsProfilerEnable without SystemSetParameter
|
||||||
|
* @tc.type: FUNC
|
||||||
|
*/
|
||||||
|
HWTEST_F(NetworkProfilerTest, NetworkProfilerTest001, TestSize.Level1)
|
||||||
|
{
|
||||||
|
auto networkProfilerMgr = std::make_shared<NetworkProfilerManager>();
|
||||||
|
auto networkProfilerService = std::make_unique<NetworkProfilerSocketService>(networkProfilerMgr);
|
||||||
|
ASSERT_TRUE(networkProfilerService != nullptr);
|
||||||
|
networkProfilerMgr->Init();
|
||||||
|
auto networkProfiler = NetworkProfiler::GetInstance();
|
||||||
|
auto ret = networkProfiler->IsProfilerEnable();
|
||||||
|
ASSERT_FALSE(ret);
|
||||||
|
NetworkProfilerSocketClient client(1, networkProfiler, CallBackFunc);
|
||||||
|
client.SendNetworkProfilerData(nullptr, 0, nullptr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @tc.name: network profiler test
|
||||||
|
* @tc.desc: Test NetworkProfilerSocketClient send empty data to server
|
||||||
|
* @tc.type: FUNC
|
||||||
|
*/
|
||||||
|
HWTEST_F(NetworkProfilerTest, NetworkProfilerTest002, TestSize.Level1)
|
||||||
|
{
|
||||||
|
auto networkProfilerMgr = std::make_shared<NetworkProfilerManager>();
|
||||||
|
auto networkProfilerService = std::make_unique<NetworkProfilerSocketService>(networkProfilerMgr);
|
||||||
|
ASSERT_TRUE(networkProfilerService != nullptr);
|
||||||
|
networkProfilerMgr->Init();
|
||||||
|
SystemSetParameter(PARAM_KAY.c_str(), std::to_string(getpid()).c_str());
|
||||||
|
auto networkProfiler = NetworkProfiler::GetInstance();
|
||||||
|
auto ret = networkProfiler->IsProfilerEnable();
|
||||||
|
ASSERT_TRUE(ret);
|
||||||
|
NetworkProfilerSocketClient client(1, networkProfiler, CallBackFunc);
|
||||||
|
ret = client.SendNetworkProfilerData(nullptr, 0, nullptr, 0);
|
||||||
|
ASSERT_FALSE(ret);
|
||||||
|
SocketContext ctx;
|
||||||
|
ret = client.ProtocolProc(ctx, 0, nullptr, 0);
|
||||||
|
ASSERT_TRUE(ret);
|
||||||
|
}
|
||||||
|
} // namespace
|
@ -146,7 +146,7 @@ HiDebug_ErrorCode OH_HiDebug_StopAppTraceCapture();
|
|||||||
* {@link HIDEBUG_SUCCESS} Get graphics memory success.
|
* {@link HIDEBUG_SUCCESS} Get graphics memory success.
|
||||||
* {@link HIDEBUG_INVALID_ARGUMENT} Invalid argument,value is null.
|
* {@link HIDEBUG_INVALID_ARGUMENT} Invalid argument,value is null.
|
||||||
* {@link HIDEBUG_TRACE_ABNORMAL} Failed to get the application memory due to a remote exception.
|
* {@link HIDEBUG_TRACE_ABNORMAL} Failed to get the application memory due to a remote exception.
|
||||||
* @since 13
|
* @since 14
|
||||||
*/
|
*/
|
||||||
HiDebug_ErrorCode OH_HiDebug_GetGraphicsMemory(uint32_t *value);
|
HiDebug_ErrorCode OH_HiDebug_GetGraphicsMemory(uint32_t *value);
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ std::map<std::string, std::string> CPU::GetSysProcessCpuLoad() const
|
|||||||
const size_t oneHundred = 100;
|
const size_t oneHundred = 100;
|
||||||
if (!processId.empty()) {
|
if (!processId.empty()) {
|
||||||
int32_t procId = 0;
|
int32_t procId = 0;
|
||||||
procId = std::stoi(processId);
|
procId = SPUtilesTye::StringToSometype<int32_t>(processId);
|
||||||
std::shared_ptr<CpuCollector> collector = CpuCollector::Create();
|
std::shared_ptr<CpuCollector> collector = CpuCollector::Create();
|
||||||
auto collectResult = collector->CollectProcessCpuStatInfo(procId, true);
|
auto collectResult = collector->CollectProcessCpuStatInfo(procId, true);
|
||||||
auto data = collectResult.data;
|
auto data = collectResult.data;
|
||||||
|
@ -36,7 +36,7 @@ long long DDR::GetDdrFreq()
|
|||||||
} else {
|
} else {
|
||||||
SPUtils::LoadFile(ddrCurFreqRkPath, ddrfreq);
|
SPUtils::LoadFile(ddrCurFreqRkPath, ddrfreq);
|
||||||
}
|
}
|
||||||
curFreq = std::atoll(ddrfreq.c_str());
|
curFreq = SPUtilesTye::StringToSometype<long long>(ddrfreq.c_str());
|
||||||
return curFreq;
|
return curFreq;
|
||||||
}
|
}
|
||||||
void DDR::SetRkFlag()
|
void DDR::SetRkFlag()
|
||||||
|
@ -68,7 +68,7 @@ int32_t GPU::GetRkGpuFreq()
|
|||||||
const std::string gpuFreqPath = "/sys/class/devfreq/fde60000.gpu/cur_freq";
|
const std::string gpuFreqPath = "/sys/class/devfreq/fde60000.gpu/cur_freq";
|
||||||
std::string rkFreq;
|
std::string rkFreq;
|
||||||
SPUtils::LoadFile(gpuFreqPath, rkFreq);
|
SPUtils::LoadFile(gpuFreqPath, rkFreq);
|
||||||
return std::stoi(rkFreq);
|
return SPUtilesTye::StringToSometype<int32_t>(rkFreq);
|
||||||
}
|
}
|
||||||
|
|
||||||
float GPU::GetRkGpuLoad()
|
float GPU::GetRkGpuLoad()
|
||||||
@ -80,7 +80,7 @@ float GPU::GetRkGpuLoad()
|
|||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
rkLoad = rkLoad.substr(0, len - 1);
|
rkLoad = rkLoad.substr(0, len - 1);
|
||||||
}
|
}
|
||||||
return std::stoi(rkLoad);
|
return SPUtilesTye::StringToSometype<float>(rkLoad);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GPU::SetRkFlag()
|
void GPU::SetRkFlag()
|
||||||
|
@ -58,8 +58,6 @@ namespace OHOS {
|
|||||||
|
|
||||||
typedef GpuCounterPlugin *(*GetGpuCounterPlugin)();
|
typedef GpuCounterPlugin *(*GetGpuCounterPlugin)();
|
||||||
GetGpuCounterPlugin startGetGpuPerfInfo = (GetGpuCounterPlugin)dlsym(handle, CREATE_PLUGIN.c_str());
|
GetGpuCounterPlugin startGetGpuPerfInfo = (GetGpuCounterPlugin)dlsym(handle, CREATE_PLUGIN.c_str());
|
||||||
gpuPlugin = startGetGpuPerfInfo;
|
|
||||||
isflugin = true;
|
|
||||||
|
|
||||||
if (type == GC_START && gcStatus == GC_INIT) {
|
if (type == GC_START && gcStatus == GC_INIT) {
|
||||||
gpuCounterData.clear();
|
gpuCounterData.clear();
|
||||||
@ -182,51 +180,5 @@ namespace OHOS {
|
|||||||
LOGI("GpuCounter collect finish.");
|
LOGI("GpuCounter collect finish.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AiScheduling::AiSchedulingSwitch()
|
|
||||||
{
|
|
||||||
void* handle = GpuCounter::GetInstance().GetSoHandle();
|
|
||||||
if (!handle) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bool aiFlag = GpuCounter::GetInstance().isflugin;
|
|
||||||
AiPlugin(aiFlag, handle);
|
|
||||||
AiStatusType();
|
|
||||||
if (type == AI_START && aiConfig == AI_INIT) {
|
|
||||||
int ret = setGameDevelopConfig()->SetGameDevelopConfig(aiConfigType, configMap);
|
|
||||||
if (ret == 1) {
|
|
||||||
LOGI("AiScheduling start");
|
|
||||||
} else {
|
|
||||||
LOGE("AiScheduling call gameService error, ret = %d", ret);
|
|
||||||
}
|
|
||||||
} else if (type == AI_CLOSE && aiConfig == AI_INIT) {
|
|
||||||
int ret = setGameDevelopConfig()->SetGameDevelopConfig(aiConfigType, configMap);
|
|
||||||
if (ret == 0) {
|
|
||||||
LOGI("AiScheduling close");
|
|
||||||
} else {
|
|
||||||
LOGE("AiScheduling call gameService error, ret = %d", ret);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
LOGE("AiScheduling state error, type: %d, state: %d", type, aiConfig);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AiScheduling::AiStatusType()
|
|
||||||
{
|
|
||||||
if (configMap["openAISched"] == "0") {
|
|
||||||
type = AI_CLOSE;
|
|
||||||
} else {
|
|
||||||
type = AI_START;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AiScheduling::AiPlugin(bool flag, void* handle)
|
|
||||||
{
|
|
||||||
if (!flag) {
|
|
||||||
setGameDevelopConfig = (GetGpuCounterPlugin)dlsym(handle, CREATE_PLUGIN.c_str());
|
|
||||||
} else {
|
|
||||||
setGameDevelopConfig = GpuCounter::GetInstance().gpuPlugin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -54,7 +54,7 @@ std::map<std::string, std::string> Temperature::ItemData()
|
|||||||
for (auto node : collectNodes) {
|
for (auto node : collectNodes) {
|
||||||
if (type.find(node) != std::string::npos) {
|
if (type.find(node) != std::string::npos) {
|
||||||
LOGI("type====: %s", type.c_str());
|
LOGI("type====: %s", type.c_str());
|
||||||
float t = std::stof(temp);
|
float t = SPUtilesTye::StringToSometype<float>(temp);
|
||||||
LOGI("temp====: %s", temp.c_str());
|
LOGI("temp====: %s", temp.c_str());
|
||||||
if (node == "gpu") {
|
if (node == "gpu") {
|
||||||
result[type] = std::to_string(t);
|
result[type] = std::to_string(t);
|
||||||
|
@ -32,7 +32,6 @@ namespace OHOS {
|
|||||||
|
|
||||||
virtual int32_t StartGetGpuPerfInfo(int64_t duration, std::unique_ptr <GpuCounterCallback> callback) = 0;
|
virtual int32_t StartGetGpuPerfInfo(int64_t duration, std::unique_ptr <GpuCounterCallback> callback) = 0;
|
||||||
virtual int32_t StopGetGpuPerfInfo() = 0;
|
virtual int32_t StopGetGpuPerfInfo() = 0;
|
||||||
virtual int32_t SetGameDevelopConfig(int32_t configType, std::map<std::string, std::string> configMap) = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class GpuCounter : public SpProfiler {
|
class GpuCounter : public SpProfiler {
|
||||||
@ -64,14 +63,11 @@ namespace OHOS {
|
|||||||
void AddGpuCounterRealtimeData(std::string dataString);
|
void AddGpuCounterRealtimeData(std::string dataString);
|
||||||
void GetGpuRealtimeData(std::map<std::string, std::string> &dataMap);
|
void GetGpuRealtimeData(std::map<std::string, std::string> &dataMap);
|
||||||
void SaveData(std::string path);
|
void SaveData(std::string path);
|
||||||
void* GetSoHandle();
|
|
||||||
typedef GpuCounterPlugin *(*GetGpuCounterPlugin)();
|
|
||||||
GetGpuCounterPlugin gpuPlugin = nullptr;
|
|
||||||
bool isflugin = false;
|
|
||||||
private:
|
private:
|
||||||
GpuCounter() {};
|
GpuCounter() {};
|
||||||
GpuCounter(const GpuCounter &);
|
GpuCounter(const GpuCounter &);
|
||||||
GpuCounter &operator = (const GpuCounter &);
|
GpuCounter &operator = (const GpuCounter &);
|
||||||
|
void* GetSoHandle();
|
||||||
GcStatus gcStatus = GC_INIT;
|
GcStatus gcStatus = GC_INIT;
|
||||||
std::vector<std::string> gpuCounterData;
|
std::vector<std::string> gpuCounterData;
|
||||||
std::vector<std::string> gpuCounterSaveReportData;
|
std::vector<std::string> gpuCounterSaveReportData;
|
||||||
@ -80,37 +76,8 @@ namespace OHOS {
|
|||||||
const std::string PLUGIN_SO_PATH = "system/lib64/libgameservice_gpucounter_plugin.z.so";
|
const std::string PLUGIN_SO_PATH = "system/lib64/libgameservice_gpucounter_plugin.z.so";
|
||||||
const std::string CREATE_PLUGIN = "onCreatePlugin";
|
const std::string CREATE_PLUGIN = "onCreatePlugin";
|
||||||
};
|
};
|
||||||
class AiScheduling {
|
|
||||||
public:
|
|
||||||
enum AiConfigType {
|
|
||||||
AI_INIT = 2,
|
|
||||||
};
|
|
||||||
enum AiSchedulingStatus {
|
|
||||||
AI_START = 1,
|
|
||||||
AI_CLOSE = 0,
|
|
||||||
};
|
|
||||||
public:
|
|
||||||
static AiScheduling &GetInstance()
|
|
||||||
{
|
|
||||||
static AiScheduling instance;
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
void AiSchedulingSwitch();
|
|
||||||
void AiStatusType();
|
|
||||||
std::map<std::string, std::string> configMap;
|
|
||||||
private:
|
|
||||||
AiScheduling() {};
|
|
||||||
AiScheduling(const AiScheduling &);
|
|
||||||
AiScheduling &operator = (const AiScheduling &);
|
|
||||||
AiConfigType aiConfig = AI_INIT;
|
|
||||||
AiSchedulingStatus type;
|
|
||||||
const std::string PLUGIN_SO_PATH = "system/lib64/libgameservice_gpucounter_plugin.z.so";
|
|
||||||
const std::string CREATE_PLUGIN = "onCreatePlugin";
|
|
||||||
typedef GpuCounterPlugin *(*GetGpuCounterPlugin)();
|
|
||||||
GetGpuCounterPlugin setGameDevelopConfig = nullptr;
|
|
||||||
void AiPlugin(bool flag, void* handle);
|
|
||||||
const int32_t aiConfigType = 2;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -163,8 +163,6 @@ const std::unordered_map<CommandType, std::string> COMMAND_MAP_REVERSE = {
|
|||||||
{ CommandType::CT_NAV, std::string("-nav") },
|
{ CommandType::CT_NAV, std::string("-nav") },
|
||||||
{ CommandType::CT_O, std::string("-o") },
|
{ CommandType::CT_O, std::string("-o") },
|
||||||
{ CommandType::CT_LF, std::string("-lockfreq") },
|
{ CommandType::CT_LF, std::string("-lockfreq") },
|
||||||
{ CommandType::CT_CLOSEAISCHEDULING, std::string("-CloseAIScheduling") },
|
|
||||||
{ CommandType::CT_OPENAISCHEDULING, std::string("-OpenAIScheduling") },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -230,7 +228,7 @@ const std::unordered_map<CmdCommand, std::string> CMD_COMMAND_MAP = {
|
|||||||
{ CmdCommand::PIDOF_SP, std::string("pidof SP_daemon") },
|
{ CmdCommand::PIDOF_SP, std::string("pidof SP_daemon") },
|
||||||
{ CmdCommand::SERVER_GREP, std::string("ps -ef | grep -v grep | grep 'SP_daemon -server'") },
|
{ CmdCommand::SERVER_GREP, std::string("ps -ef | grep -v grep | grep 'SP_daemon -server'") },
|
||||||
{ CmdCommand::EDITOR_SERVER_GREP, std::string("ps -ef | grep -v grep | grep 'SP_daemon -editorServer'") },
|
{ CmdCommand::EDITOR_SERVER_GREP, std::string("ps -ef | grep -v grep | grep 'SP_daemon -editorServer'") },
|
||||||
{ CmdCommand::UINPUT_BACK, std::string("uinput -K -d 2076 -d 2020") },
|
{ CmdCommand::UINPUT_BACK, std::string("uinput -T -m 600 2760 600 1300 200") },
|
||||||
{ CmdCommand::TIMESTAMPS, std::string("timestamps") },
|
{ CmdCommand::TIMESTAMPS, std::string("timestamps") },
|
||||||
{ CmdCommand::USER_PERMISSIONS, std::string("whoami") },
|
{ CmdCommand::USER_PERMISSIONS, std::string("whoami") },
|
||||||
};
|
};
|
||||||
|
@ -110,8 +110,6 @@ public:
|
|||||||
// 采集配置项
|
// 采集配置项
|
||||||
std::vector<std::string> configs;
|
std::vector<std::string> configs;
|
||||||
GpuCounter &gpuCounter = GpuCounter::GetInstance();
|
GpuCounter &gpuCounter = GpuCounter::GetInstance();
|
||||||
AiScheduling &aiScheduling = AiScheduling::GetInstance();
|
|
||||||
void IsGpuCounter(bool &flag, std::vector<std::string> cmdConfig);
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,21 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
namespace OHOS {
|
namespace OHOS {
|
||||||
namespace SmartPerf {
|
namespace SmartPerf {
|
||||||
|
class SPUtilesTye {
|
||||||
|
public:
|
||||||
|
template<typename T>
|
||||||
|
static T StringToSometype(const std::string& str)
|
||||||
|
{
|
||||||
|
T result;
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << str;
|
||||||
|
ss >> result;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
namespace SPUtils {
|
namespace SPUtils {
|
||||||
/**
|
/**
|
||||||
* @brief Check if the file has permission to access
|
* @brief Check if the file has permission to access
|
||||||
|
@ -55,16 +55,16 @@ double ParseClickCompleteTrace::GetLineTime()
|
|||||||
size_t position1 = line.find("....");
|
size_t position1 = line.find("....");
|
||||||
size_t position2 = line.find(":");
|
size_t position2 = line.find(":");
|
||||||
endTime = line.substr(position1 + subNum, position2 - position1 - subNum);
|
endTime = line.substr(position1 + subNum, position2 - position1 - subNum);
|
||||||
int endNum = std::stof(endTime);
|
int endNum = SPUtilesTye::StringToSometype<float>(endTime);
|
||||||
int endFlagNum = std::stof(endTimeFlag);
|
int endFlagNum = SPUtilesTye::StringToSometype<float>(endTimeFlag);
|
||||||
int startNum = std::stof(startTime);
|
int startNum = SPUtilesTye::StringToSometype<float>(startTime);
|
||||||
int timeNum = endNum - endFlagNum;
|
int timeNum = endNum - endFlagNum;
|
||||||
float interval = 0.3;
|
float interval = 0.3;
|
||||||
if (timeNum < interval) {
|
if (timeNum < interval) {
|
||||||
endTimeFlag = endTime;
|
endTimeFlag = endTime;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (std::stof(endTimeFlag) == 0) {
|
if (SPUtilesTye::StringToSometype<float>(endTimeFlag) == 0) {
|
||||||
endTimeFlag = endTime;
|
endTimeFlag = endTime;
|
||||||
} else if (endFlagNum != 0 && startNum != 0 && timeNum > interval) {
|
} else if (endFlagNum != 0 && startNum != 0 && timeNum > interval) {
|
||||||
break;
|
break;
|
||||||
@ -82,10 +82,11 @@ double ParseClickCompleteTrace::GetTime(std::string endTime)
|
|||||||
float subNum = 2;
|
float subNum = 2;
|
||||||
endTime = endTime.substr(point - subNum);
|
endTime = endTime.substr(point - subNum);
|
||||||
startTime = startTime.substr(point - subNum);
|
startTime = startTime.substr(point - subNum);
|
||||||
if (std::stof(endTime) == 0 || std::stof(startTime) == 0) {
|
if (SPUtilesTye::StringToSometype<float>(endTime) == 0 || SPUtilesTye::StringToSometype<float>(startTime) == 0) {
|
||||||
} else {
|
} else {
|
||||||
double displayTime = 0.032;
|
double displayTime = 0.032;
|
||||||
completeTime = std::stof(endTime) - std::stof(startTime) + displayTime;
|
completeTime = SPUtilesTye::StringToSometype<float>(endTime) -
|
||||||
|
SPUtilesTye::StringToSometype<float>(startTime) + displayTime;
|
||||||
}
|
}
|
||||||
return completeTime;
|
return completeTime;
|
||||||
}
|
}
|
||||||
|
@ -50,20 +50,20 @@ double ParseClickResponseTrace::GetLineTime()
|
|||||||
std::string::size_type doComposition;
|
std::string::size_type doComposition;
|
||||||
size_t subNum = 5;
|
size_t subNum = 5;
|
||||||
while (getline(infile, line)) {
|
while (getline(infile, line)) {
|
||||||
appPid = SmartPerf::ParseClickResponseTrace::GetPid(line, "pid", appPid);
|
appPid = ParseClickResponseTrace::GetPid(line, "pid", appPid);
|
||||||
startTime = SmartPerf::ParseClickResponseTrace::GetStartTime(line, startTime);
|
startTime = ParseClickResponseTrace::GetStartTime(line, startTime);
|
||||||
doComposition = line.find("H:RSMainThread::DoComposition");
|
doComposition = line.find("H:RSMainThread::DoComposition");
|
||||||
if (doComposition != std::string::npos) {
|
if (doComposition != std::string::npos) {
|
||||||
size_t position1 = line.find("....");
|
size_t position1 = line.find("....");
|
||||||
size_t position2 = line.find(":");
|
size_t position2 = line.find(":");
|
||||||
endTime = line.substr(position1 + subNum, position2 - position1 - subNum);
|
endTime = line.substr(position1 + subNum, position2 - position1 - subNum);
|
||||||
if (std::stof(startTime) == 0) {
|
if (SPUtilesTye::StringToSometype<float>(startTime) == 0) {
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
completeTime = SmartPerf::ParseClickResponseTrace::GetTime(startTime, endTime);
|
completeTime = ParseClickResponseTrace::GetTime(startTime, endTime);
|
||||||
return completeTime;
|
return completeTime;
|
||||||
}
|
}
|
||||||
double ParseClickResponseTrace::GetTime(std::string startTime, std::string endTime)
|
double ParseClickResponseTrace::GetTime(std::string startTime, std::string endTime)
|
||||||
@ -72,10 +72,11 @@ double ParseClickResponseTrace::GetTime(std::string startTime, std::string endTi
|
|||||||
float subNum = 2;
|
float subNum = 2;
|
||||||
endTime = endTime.substr(point - subNum);
|
endTime = endTime.substr(point - subNum);
|
||||||
startTime = startTime.substr(point - subNum);
|
startTime = startTime.substr(point - subNum);
|
||||||
if (std::stof(endTime) == 0 || std::stof(startTime) == 0) {
|
if (SPUtilesTye::StringToSometype<float>(endTime) == 0 || SPUtilesTye::StringToSometype<float>(startTime) == 0) {
|
||||||
} else {
|
} else {
|
||||||
double displayTime = 0.032;
|
double displayTime = 0.032;
|
||||||
completeTime = std::stof(endTime) - std::stof(startTime) + displayTime;
|
completeTime = SPUtilesTye::StringToSometype<float>(endTime) -
|
||||||
|
SPUtilesTye::StringToSometype<float>(startTime) + displayTime;
|
||||||
}
|
}
|
||||||
return completeTime;
|
return completeTime;
|
||||||
}
|
}
|
||||||
|
@ -26,20 +26,21 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "include/parse_radar.h"
|
#include "include/parse_radar.h"
|
||||||
#include "include/sp_log.h"
|
#include "include/sp_log.h"
|
||||||
|
#include "include/sp_utils.h"
|
||||||
namespace OHOS {
|
namespace OHOS {
|
||||||
namespace SmartPerf {
|
namespace SmartPerf {
|
||||||
double ParseRadar::ParseRadarStart(const std::string &string) const
|
double ParseRadar::ParseRadarStart(const std::string &string) const
|
||||||
{
|
{
|
||||||
double time = -1;
|
double time = -1;
|
||||||
std::string target = "\"E2E_LATENCY\":";
|
std::string target = "\"E2E_LATENCY\":";
|
||||||
time = std::stod(ExtractString(string, target));
|
time = SPUtilesTye::StringToSometype<double>(ExtractString(string, target));
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
double ParseRadar::ParseRadarStartResponse(const std::string &string) const
|
double ParseRadar::ParseRadarStartResponse(const std::string &string) const
|
||||||
{
|
{
|
||||||
double time = -1;
|
double time = -1;
|
||||||
std::string target = "\"RESPONSE_LATENCY\":";
|
std::string target = "\"RESPONSE_LATENCY\":";
|
||||||
time = std::stod(ExtractString(string, target));
|
time = SPUtilesTye::StringToSometype<double>(ExtractString(string, target));
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
std::string ParseRadar::ParseRadarAppStrart(const std::string &string) const
|
std::string ParseRadar::ParseRadarAppStrart(const std::string &string) const
|
||||||
@ -100,7 +101,7 @@ int ParseRadar::GetMaxDelayTime(const int &delayTime, std::vector<std::string> &
|
|||||||
{
|
{
|
||||||
int maxNum = -1;
|
int maxNum = -1;
|
||||||
for (size_t i = 0; i < delayTimeVec.size(); i++) {
|
for (size_t i = 0; i < delayTimeVec.size(); i++) {
|
||||||
int num = std::stoi(delayTimeVec[i]);
|
int num = SPUtilesTye::StringToSometype<int>(delayTimeVec[i]);
|
||||||
if (num < delayTime && num > maxNum) {
|
if (num < delayTime && num > maxNum) {
|
||||||
maxNum = num;
|
maxNum = num;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include <regex>
|
#include <regex>
|
||||||
#include "include/parse_slide_fps_trace.h"
|
#include "include/parse_slide_fps_trace.h"
|
||||||
#include "include/sp_log.h"
|
#include "include/sp_log.h"
|
||||||
|
#include "include/sp_utils.h"
|
||||||
|
|
||||||
namespace OHOS {
|
namespace OHOS {
|
||||||
namespace SmartPerf {
|
namespace SmartPerf {
|
||||||
@ -48,13 +49,13 @@ double ParseSlideFpsTrace::CalculateTime()
|
|||||||
if (count == four) {
|
if (count == four) {
|
||||||
needTime = true;
|
needTime = true;
|
||||||
frameNow = 0;
|
frameNow = 0;
|
||||||
touchTime = std::stod(SmartPerf::ParseSlideFpsTrace::GetLineTime(line));
|
touchTime = SPUtilesTye::StringToSometype<double>(ParseSlideFpsTrace::GetLineTime(line));
|
||||||
LOGI("ParseSlideFpsTrace::touchTime: (%s)", std::to_string(touchTime).c_str());
|
LOGI("ParseSlideFpsTrace::touchTime: (%s)", std::to_string(touchTime).c_str());
|
||||||
swiperFlingFlag = 0;
|
swiperFlingFlag = 0;
|
||||||
}
|
}
|
||||||
} else if (line.find("H:RSMainThread::DoComposition") != std::string::npos) {
|
} else if (line.find("H:RSMainThread::DoComposition") != std::string::npos) {
|
||||||
frameNow++;
|
frameNow++;
|
||||||
doCompositionTime = std::stod(SmartPerf::ParseSlideFpsTrace::GetLineTime(line));
|
doCompositionTime = SPUtilesTye::StringToSometype<double>(ParseSlideFpsTrace::GetLineTime(line));
|
||||||
LOGI("ParseSlideFpsTrace::doCompositionTime: (%s)", std::to_string(doCompositionTime).c_str());
|
LOGI("ParseSlideFpsTrace::doCompositionTime: (%s)", std::to_string(doCompositionTime).c_str());
|
||||||
} else if (line.find("H:WEB_LIST_FLING") != std::string::npos ||
|
} else if (line.find("H:WEB_LIST_FLING") != std::string::npos ||
|
||||||
line.find("H:APP_LIST_FLING,") != std::string::npos) {
|
line.find("H:APP_LIST_FLING,") != std::string::npos) {
|
||||||
@ -92,7 +93,7 @@ void ParseSlideFpsTrace::AppSwiperScroll(std::string line)
|
|||||||
{
|
{
|
||||||
if (line.find("H:APP_SWIPER_SCROLL,") != std::string::npos) {
|
if (line.find("H:APP_SWIPER_SCROLL,") != std::string::npos) {
|
||||||
if (swiperScrollFlag == 0) {
|
if (swiperScrollFlag == 0) {
|
||||||
touchTime = std::stod(SmartPerf::ParseSlideFpsTrace::GetLineTime(line));
|
touchTime = SPUtilesTye::StringToSometype<double>(ParseSlideFpsTrace::GetLineTime(line));
|
||||||
LOGI("AppSwiperScroll.touchTime: (%s)", std::to_string(touchTime).c_str());
|
LOGI("AppSwiperScroll.touchTime: (%s)", std::to_string(touchTime).c_str());
|
||||||
needTime = true;
|
needTime = true;
|
||||||
swiperScrollFlag = 1;
|
swiperScrollFlag = 1;
|
||||||
|
@ -144,12 +144,12 @@ void ProfilerFPS::GetTimeDiff()
|
|||||||
if (params[0].find("CLOCK_REALTIME") != std::string::npos && clockRealTime == 0) {
|
if (params[0].find("CLOCK_REALTIME") != std::string::npos && clockRealTime == 0) {
|
||||||
strRealTime = params[two];
|
strRealTime = params[two];
|
||||||
strRealTime.erase(strRealTime.find('.'), 1);
|
strRealTime.erase(strRealTime.find('.'), 1);
|
||||||
clockRealTime = std::stoll(strRealTime);
|
clockRealTime = SPUtilesTye::StringToSometype<long long>(strRealTime);
|
||||||
currRealTime = clockRealTime;
|
currRealTime = clockRealTime;
|
||||||
} else if (params[0].find("CLOCK_MONOTONIC_RAW") != std::string::npos && clockMonotonicRaw == 0) {
|
} else if (params[0].find("CLOCK_MONOTONIC_RAW") != std::string::npos && clockMonotonicRaw == 0) {
|
||||||
strRealTime = params[two];
|
strRealTime = params[two];
|
||||||
strRealTime.erase(strRealTime.find('.'), 1);
|
strRealTime.erase(strRealTime.find('.'), 1);
|
||||||
clockMonotonicRaw = std::stoll(strRealTime);
|
clockMonotonicRaw = SPUtilesTye::StringToSometype<long long>(strRealTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pclose(fd) == -1) {
|
if (pclose(fd) == -1) {
|
||||||
@ -240,12 +240,13 @@ void ProfilerFPS::GetFPS(std::vector<std::string> v)
|
|||||||
if (v[number] == "") {
|
if (v[number] == "") {
|
||||||
printf("the args of num must be not-null!\n");
|
printf("the args of num must be not-null!\n");
|
||||||
} else {
|
} else {
|
||||||
this->num = atoi(v[number].c_str());
|
this->num = SPUtilesTye::StringToSometype<int>(v[number].c_str());
|
||||||
if (this->num < 0) {
|
if (this->num < 0) {
|
||||||
printf("set num:%d not valid arg\n", this->num);
|
printf("set num:%d not valid arg\n", this->num);
|
||||||
}
|
}
|
||||||
printf("set num:%d success\n", this->num);
|
printf("set num:%d success\n", this->num);
|
||||||
int sectionsNum = (static_cast<int>(v.size()) >= four) ? atoi(v[four].c_str()) : 0;
|
int sectionsNum = (static_cast<int>(v.size()) >= four) ?
|
||||||
|
SPUtilesTye::StringToSometype<int>(v[four].c_str()) : 0;
|
||||||
if (sectionsNum > ten) {
|
if (sectionsNum > ten) {
|
||||||
printf("set sectionsNum:%d not valid arg \n", sectionsNum);
|
printf("set sectionsNum:%d not valid arg \n", sectionsNum);
|
||||||
} else {
|
} else {
|
||||||
@ -405,7 +406,7 @@ void ProfilerFPS::GetOhFps(std::vector<std::string> v)
|
|||||||
if (v[number] == "") {
|
if (v[number] == "") {
|
||||||
printf("the args of num must be not-null!\n");
|
printf("the args of num must be not-null!\n");
|
||||||
} else {
|
} else {
|
||||||
this->num = atoi(v[number].c_str());
|
this->num = SPUtilesTye::StringToSometype<int>(v[number].c_str());
|
||||||
if (this->num < 0) {
|
if (this->num < 0) {
|
||||||
printf("set num:%d not vaild arg\n", this->num);
|
printf("set num:%d not vaild arg\n", this->num);
|
||||||
}
|
}
|
||||||
@ -415,7 +416,7 @@ void ProfilerFPS::GetOhFps(std::vector<std::string> v)
|
|||||||
if (static_cast<int>(v.size()) < four) {
|
if (static_cast<int>(v.size()) < four) {
|
||||||
sectionsNum = 0;
|
sectionsNum = 0;
|
||||||
} else {
|
} else {
|
||||||
sectionsNum = atoi(v[four].c_str());
|
sectionsNum = SPUtilesTye::StringToSometype<int>(v[four].c_str());
|
||||||
}
|
}
|
||||||
for (int i = 0; i < this->num; i++) {
|
for (int i = 0; i < this->num; i++) {
|
||||||
GetResultFPS(sectionsNum);
|
GetResultFPS(sectionsNum);
|
||||||
|
@ -108,8 +108,9 @@ namespace OHOS {
|
|||||||
} else if (first == "para0") {
|
} else if (first == "para0") {
|
||||||
eventName = second;
|
eventName = second;
|
||||||
} else if (first == "time") {
|
} else if (first == "time") {
|
||||||
realTimestamp = std::to_string(std::stoll(second) - SPTask::GetInstance().GetRealStartTime());
|
realTimestamp = std::to_string(SPUtilesTye::StringToSometype<long long>(second) -
|
||||||
timestamp = std::to_string(std::stoll(second) - params.startTime);
|
SPTask::GetInstance().GetRealStartTime());
|
||||||
|
timestamp = std::to_string(SPUtilesTye::StringToSometype<long long>(second) - params.startTime);
|
||||||
} else if (first == "enable") {
|
} else if (first == "enable") {
|
||||||
enable = second;
|
enable = second;
|
||||||
} else if (first == "value") {
|
} else if (first == "value") {
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
#include <thread>
|
#include <thread>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <map>
|
|
||||||
#include "unistd.h"
|
#include "unistd.h"
|
||||||
#include "include/heartbeat.h"
|
#include "include/heartbeat.h"
|
||||||
#include "include/sp_utils.h"
|
#include "include/sp_utils.h"
|
||||||
@ -29,7 +28,6 @@
|
|||||||
#include "include/sp_log.h"
|
#include "include/sp_log.h"
|
||||||
#include "include/RAM.h"
|
#include "include/RAM.h"
|
||||||
#include "include/common.h"
|
#include "include/common.h"
|
||||||
#include "include/GpuCounter.h"
|
|
||||||
|
|
||||||
namespace OHOS {
|
namespace OHOS {
|
||||||
namespace SmartPerf {
|
namespace SmartPerf {
|
||||||
@ -132,7 +130,7 @@ void SmartPerfCommand::HandleCommand(std::string argStr, const std::string &argS
|
|||||||
LOGI("SmartPerfCommand::HandleCommand argStr(%s) argStr1(%s)", argStr.c_str(), argStr1.c_str());
|
LOGI("SmartPerfCommand::HandleCommand argStr(%s) argStr1(%s)", argStr.c_str(), argStr1.c_str());
|
||||||
switch (COMMAND_MAP.at(argStr)) {
|
switch (COMMAND_MAP.at(argStr)) {
|
||||||
case CommandType::CT_N:
|
case CommandType::CT_N:
|
||||||
num = atoi(argStr1.c_str());
|
num = SPUtilesTye::StringToSometype<int>(argStr1.c_str());
|
||||||
break;
|
break;
|
||||||
case CommandType::CT_PKG:
|
case CommandType::CT_PKG:
|
||||||
pkgName = argStr1;
|
pkgName = argStr1;
|
||||||
@ -165,8 +163,6 @@ void SmartPerfCommand::HandleCommand(std::string argStr, const std::string &argS
|
|||||||
case CommandType::CT_HW:
|
case CommandType::CT_HW:
|
||||||
case CommandType::CT_GC:
|
case CommandType::CT_GC:
|
||||||
case CommandType::CT_NAV:
|
case CommandType::CT_NAV:
|
||||||
case CommandType::CT_OPENAISCHEDULING:
|
|
||||||
case CommandType::CT_CLOSEAISCHEDULING:
|
|
||||||
configs.push_back(argStr);
|
configs.push_back(argStr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -187,11 +183,11 @@ int SmartPerfCommand::GetItemInfo(std::multimap<std::string, std::string, declty
|
|||||||
}
|
}
|
||||||
for (size_t j = 0; j < configs.size(); j++) {
|
for (size_t j = 0; j < configs.size(); j++) {
|
||||||
std::string curParam = configs[j];
|
std::string curParam = configs[j];
|
||||||
if (curParam.find("-gc") != std::string::npos ||
|
|
||||||
curParam.find("-CloseAIScheduling") != std::string::npos ||
|
if (curParam.find("-gc") != std::string::npos) {
|
||||||
curParam.find("-OpenAIScheduling") != std::string::npos) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SpProfiler *profiler = SpProfilerFactory::GetCmdProfilerItem(COMMAND_MAP.at(curParam), true);
|
SpProfiler *profiler = SpProfilerFactory::GetCmdProfilerItem(COMMAND_MAP.at(curParam), true);
|
||||||
if (profiler != nullptr) {
|
if (profiler != nullptr) {
|
||||||
std::map<std::string, std::string> data = profiler->ItemData();
|
std::map<std::string, std::string> data = profiler->ItemData();
|
||||||
@ -204,6 +200,7 @@ int SmartPerfCommand::GetItemInfo(std::multimap<std::string, std::string, declty
|
|||||||
LOGE("%s", errInfo.c_str());
|
LOGE("%s", errInfo.c_str());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,7 +221,12 @@ std::string SmartPerfCommand::ExecCommand()
|
|||||||
const long long freq = 1000;
|
const long long freq = 1000;
|
||||||
num = num + 1;
|
num = num + 1;
|
||||||
bool gcFlag = false;
|
bool gcFlag = false;
|
||||||
IsGpuCounter(gcFlag, configs);
|
for (std::string itConfig : configs) {
|
||||||
|
if (itConfig.find("-gc") != std::string::npos) {
|
||||||
|
gpuCounter.StartCollect(GpuCounter::GC_START);
|
||||||
|
gcFlag = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
while (index < num) {
|
while (index < num) {
|
||||||
std::multimap<std::string, std::string, decltype(SPUtils::Cmp) *> spMap(SPUtils::Cmp);
|
std::multimap<std::string, std::string, decltype(SPUtils::Cmp) *> spMap(SPUtils::Cmp);
|
||||||
long long lastTime = SPUtils::GetCurTime();
|
long long lastTime = SPUtils::GetCurTime();
|
||||||
@ -287,29 +289,5 @@ void SmartPerfCommand::InitSomething()
|
|||||||
LOGI("SmartPerfCommand::InitSomething Privilege escalation!");
|
LOGI("SmartPerfCommand::InitSomething Privilege escalation!");
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void SmartPerfCommand::IsGpuCounter(bool &flag, std::vector<std::string> cmdConfig)
|
|
||||||
{
|
|
||||||
for (std::string itConfig : cmdConfig) {
|
|
||||||
if (itConfig.find("-gc") != std::string::npos) {
|
|
||||||
gpuCounter.StartCollect(GpuCounter::GC_START);
|
|
||||||
flag = true;
|
|
||||||
}
|
|
||||||
if (itConfig.find("-CloseAIScheduling") != std::string::npos) {
|
|
||||||
std::map<std::string, std::string> figMap;
|
|
||||||
figMap["bundleName"] = pkgName;
|
|
||||||
figMap["openAISched"] = "0";
|
|
||||||
aiScheduling.configMap.insert(figMap.begin(), figMap.end());
|
|
||||||
aiScheduling.AiSchedulingSwitch();
|
|
||||||
}
|
|
||||||
if (itConfig.find("-OpenAIScheduling") != std::string::npos) {
|
|
||||||
std::map<std::string, std::string> figMap;
|
|
||||||
figMap["bundleName"] = pkgName;
|
|
||||||
figMap["openAISched"] = "1";
|
|
||||||
aiScheduling.configMap.insert(figMap.begin(), figMap.end());
|
|
||||||
aiScheduling.AiSchedulingSwitch();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,16 +146,16 @@ void SpProfilerFactory::SetByTrace(std::string message)
|
|||||||
std::vector<std::string> vItems;
|
std::vector<std::string> vItems;
|
||||||
SPUtils::StrSplit(vItem, delim, vItems);
|
SPUtils::StrSplit(vItem, delim, vItems);
|
||||||
if (vItems[0] == "traceSum") {
|
if (vItems[0] == "traceSum") {
|
||||||
mSum = std::stoi(vItems[1]);
|
mSum = SPUtilesTye::StringToSometype<int>(vItems[1]);
|
||||||
}
|
}
|
||||||
if (vItems[0] == "fpsJitterTime") {
|
if (vItems[0] == "fpsJitterTime") {
|
||||||
mThreshold = std::stoi(vItems[1]);
|
mThreshold = SPUtilesTye::StringToSometype<int>(vItems[1]);
|
||||||
}
|
}
|
||||||
if (vItems[0] == "catchInterval") {
|
if (vItems[0] == "catchInterval") {
|
||||||
mInterval = std::stoi(vItems[1]);
|
mInterval = SPUtilesTye::StringToSometype<int>(vItems[1]);
|
||||||
}
|
}
|
||||||
if (vItems[0] == "lowFps") {
|
if (vItems[0] == "lowFps") {
|
||||||
lowFps = std::stoi(vItems[1]);
|
lowFps = SPUtilesTye::StringToSometype<int>(vItems[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const ByTrace &bTrace = ByTrace::GetInstance();
|
const ByTrace &bTrace = ByTrace::GetInstance();
|
||||||
|
@ -64,14 +64,14 @@ static ExceptionMsg ParseToTask(std::string command, TaskInfo &taskInfo)
|
|||||||
if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_SESSIONID)) {
|
if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_SESSIONID)) {
|
||||||
sessionId = args[++i];
|
sessionId = args[++i];
|
||||||
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_INTERVAL)) {
|
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_INTERVAL)) {
|
||||||
interval = std::stoll(args[++i]);
|
interval = SPUtilesTye::StringToSometype<long long>(args[++i]);
|
||||||
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_PKG)) {
|
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_PKG)) {
|
||||||
pkg = args[++i];
|
pkg = args[++i];
|
||||||
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_FL)) { // 获取用户fps的值,并赋给snf. CT_FL
|
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_FL)) { // 获取用户fps的值,并赋给snf. CT_FL
|
||||||
snf.fps = std::stoi(args[++i]);
|
snf.fps = SPUtilesTye::StringToSometype<int>(args[++i]);
|
||||||
snf.isEffective = true;
|
snf.isEffective = true;
|
||||||
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_FTL)) { // 获取frameTime的值 CT_FTL
|
} else if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_FTL)) { // 获取frameTime的值 CT_FTL
|
||||||
snf.frameTime = std::stoi(args[++i]);
|
snf.frameTime = SPUtilesTye::StringToSometype<int>(args[++i]);
|
||||||
snf.isEffective = true;
|
snf.isEffective = true;
|
||||||
} else {
|
} else {
|
||||||
if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_F)) { // 判断用户设置是否有-f
|
if (args[i] == COMMAND_MAP_REVERSE.at(CommandType::CT_F)) { // 判断用户设置是否有-f
|
||||||
|
@ -63,8 +63,8 @@ bool SPUtils::Cmp(const std::string &a, const std::string &b)
|
|||||||
if (str1 != str2) {
|
if (str1 != str2) {
|
||||||
return str1 < str2;
|
return str1 < str2;
|
||||||
}
|
}
|
||||||
int num1 = std::stoi(a.substr(str1.length()));
|
int num1 = SPUtilesTye::StringToSometype<int>(a.substr(str1.length()));
|
||||||
int num2 = std::stoi(b.substr(str2.length()));
|
int num2 = SPUtilesTye::StringToSometype<int>(b.substr(str2.length()));
|
||||||
return num1 < num2;
|
return num1 < num2;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include "include/stalling_rate_trace.h"
|
#include "include/stalling_rate_trace.h"
|
||||||
#include "include/sp_log.h"
|
#include "include/sp_log.h"
|
||||||
|
#include "include/sp_utils.h"
|
||||||
|
|
||||||
namespace OHOS {
|
namespace OHOS {
|
||||||
namespace SmartPerf {
|
namespace SmartPerf {
|
||||||
@ -202,7 +203,7 @@ void StallingRateTrace::AppList(const std::string &line, const std::string &sign
|
|||||||
}
|
}
|
||||||
std::string waitFenceId = "|H:Waiting for Present Fence " + std::to_string(fenceId);
|
std::string waitFenceId = "|H:Waiting for Present Fence " + std::to_string(fenceId);
|
||||||
if (line.find(waitFenceId) != std::string::npos) {
|
if (line.find(waitFenceId) != std::string::npos) {
|
||||||
nowTime = std::stod(SmartPerf::StallingRateTrace::GetOnScreenTimeStart(line));
|
nowTime = SPUtilesTye::StringToSometype<double>(StallingRateTrace::GetOnScreenTimeStart(line));
|
||||||
GetFrameLossTime(nowTime, lastTime, roundTime, frameLossTime);
|
GetFrameLossTime(nowTime, lastTime, roundTime, frameLossTime);
|
||||||
LOGI("frameLossTime: (%s)", std::to_string(frameLossTime).c_str());
|
LOGI("frameLossTime: (%s)", std::to_string(frameLossTime).c_str());
|
||||||
lastTime = nowTime;
|
lastTime = nowTime;
|
||||||
@ -323,7 +324,7 @@ void StallingRateTrace::AppSwiperScroll(const std::string &line, const std::stri
|
|||||||
}
|
}
|
||||||
std::string waitFenceId = "|H:Waiting for Present Fence " + std::to_string(fenceIdSwiper);
|
std::string waitFenceId = "|H:Waiting for Present Fence " + std::to_string(fenceIdSwiper);
|
||||||
if (line.find(waitFenceId) != std::string::npos) {
|
if (line.find(waitFenceId) != std::string::npos) {
|
||||||
nowSwiperTime = std::stod(SmartPerf::StallingRateTrace::GetOnScreenTimeStart(line));
|
nowSwiperTime = SPUtilesTye::StringToSometype<double>(StallingRateTrace::GetOnScreenTimeStart(line));
|
||||||
LOGI("nowSwiperTime: (%s)", std::to_string(nowSwiperTime).c_str());
|
LOGI("nowSwiperTime: (%s)", std::to_string(nowSwiperTime).c_str());
|
||||||
GetFrameLossTime(nowSwiperTime, lastSwiperTime, roundSwiperTime, frameLossSwiperTime);
|
GetFrameLossTime(nowSwiperTime, lastSwiperTime, roundSwiperTime, frameLossSwiperTime);
|
||||||
LOGI("frameLossSwiperTime: (%s)", std::to_string(frameLossSwiperTime).c_str());
|
LOGI("frameLossSwiperTime: (%s)", std::to_string(frameLossSwiperTime).c_str());
|
||||||
@ -388,12 +389,12 @@ double StallingRateTrace::GetFrameRate(const std::string &line) const
|
|||||||
std::string result1 = line.substr(pos1 + delimiter.length());
|
std::string result1 = line.substr(pos1 + delimiter.length());
|
||||||
size_t pos2 = line.find(delimiter1);
|
size_t pos2 = line.find(delimiter1);
|
||||||
std::string result2 = result1.substr(0, pos2);
|
std::string result2 = result1.substr(0, pos2);
|
||||||
rate = std::stod(result2.c_str());
|
rate = SPUtilesTye::StringToSometype<double>(result2.c_str());
|
||||||
}
|
}
|
||||||
if (line.find("rate:") != std::string::npos) {
|
if (line.find("rate:") != std::string::npos) {
|
||||||
size_t pos = line.find(delimiter);
|
size_t pos = line.find(delimiter);
|
||||||
std::string result = line.substr(pos + delimiter.length());
|
std::string result = line.substr(pos + delimiter.length());
|
||||||
rate = std::stod(result.c_str());
|
rate = SPUtilesTye::StringToSometype<double>(result.c_str());
|
||||||
}
|
}
|
||||||
return rate;
|
return rate;
|
||||||
}
|
}
|
||||||
@ -403,7 +404,7 @@ int StallingRateTrace::GetFenceId(const std::string &line) const
|
|||||||
std::string delimiter = "H:Present Fence ";
|
std::string delimiter = "H:Present Fence ";
|
||||||
size_t pos = line.find(delimiter);
|
size_t pos = line.find(delimiter);
|
||||||
std::string result = line.substr(pos + delimiter.length());
|
std::string result = line.substr(pos + delimiter.length());
|
||||||
int presentFenceId = std::atoi(result.c_str());
|
int presentFenceId = SPUtilesTye::StringToSometype<int>(result.c_str());
|
||||||
return presentFenceId;
|
return presentFenceId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,7 +425,8 @@ double StallingRateTrace::GetTimes(const std::string &line, const std::string &s
|
|||||||
if (positionFirst != std::string::npos && positionSecond != std::string::npos) {
|
if (positionFirst != std::string::npos && positionSecond != std::string::npos) {
|
||||||
if (line.find(sign) != std::string::npos) {
|
if (line.find(sign) != std::string::npos) {
|
||||||
size_t subNum = 7;
|
size_t subNum = 7;
|
||||||
return std::stod(line.substr(positionFirst + subNum, positionSecond - positionFirst - subNum));
|
return SPUtilesTye::StringToSometype<double>(line.substr(
|
||||||
|
positionFirst + subNum, positionSecond - positionFirst - subNum));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
Loading…
Reference in New Issue
Block a user