From 580afeb09849f236364ba56c5d9a6d569f5cc207 Mon Sep 17 00:00:00 2001 From: TaowerfulMAX Date: Fri, 12 Sep 2025 17:50:24 +0800 Subject: [PATCH] feat: split the super large function in native_daemon Signed-off-by: TaowerfulMAX --- .../native_daemon/native_daemon_client.cpp | 312 +++++---- device/plugins/native_daemon/src/main.cpp | 638 +++++++++++------- 2 files changed, 568 insertions(+), 382 deletions(-) diff --git a/device/plugins/native_daemon/native_daemon_client.cpp b/device/plugins/native_daemon/native_daemon_client.cpp index bbcda933d..24e35e071 100644 --- a/device/plugins/native_daemon/native_daemon_client.cpp +++ b/device/plugins/native_daemon/native_daemon_client.cpp @@ -46,151 +46,154 @@ bool IsNumeric(const std::string& str) } return true; } + +void PrintHelpMessage() +{ + printf(" --start -s : start, default: false\n"); + printf(" --stop -k : stop, default: false\n"); + printf(" --pid -p : pid\n"); + printf(" --filePath -f : filePath, default: "); + printf("/data/local/tmp/hiprofiler_data.htrace\n"); + printf(" --duration -d : duration, default: 20s\n"); + printf(" --filterSize -fs : filterSize, default: 0\n"); + printf(" --shareMemorySize -sms : shareMemorySize, default: 16384\n"); + printf(" --processName -pn : processName\n"); + printf(" --maxStackDepth -msd : maxStackDepth, default: 30\n"); + printf(" --mallocDisable -mad : mallocDisable, default: false\n"); + printf(" --mmapDisable -mmd : mmapDisable, default: false\n"); + printf(" --freeStackData -fsd : freeStackData, default: false\n"); + printf(" --munmapStackData -musd : munmapStackData, default: false\n"); + printf(" --mallocFreeMatchingInterval -mfmi : mallocFreeMatchingInterval\n"); + printf(" --mallocFreeMatchingCnt -mfmc : mallocFreeMatchingCnt\n"); + printf(" --disable_stringCompressed -sc : disable_stringCompressed, "); + printf("default: stringCompressed\n"); + printf(" --dwarf -df : dwarf unwind, default: fp\n"); + printf(" --disable_blocked -b : disable_blocked, default: blocked\n"); + printf(" --disable_recordAccurately -ra : disable_recordAccurately, "); + printf("default: recordAccurately\n"); + printf(" --startupMode -sm : startupMode, default: false\n"); + printf(" --memtraceEnable -me : memtraceEnable, default: false\n"); + printf(" --offlineSymbolization -os : offlineSymbolization, default: false\n"); + printf(" --callframeCompress -cc : callframeCompress, default: false\n"); + printf(" --statisticsInterval -si : statisticsInterval\n"); + printf(" --clockId -c : clockId\n"); + printf(" --dumpData -dd : dump data\n"); + printf(" --sampleInterval -spi : sampleInterval, default: 0\n"); + printf(" --jsStackReport -jr : jsStackReport, default: 0\n"); + printf(" --maxJsStackDepth -mjsd : maxJsStackDepth, default: 0\n"); + printf(" --filterNapiName -fnapi : filterNapiName \n"); + printf(" --hookstandalone -hsa : hookstandalone \n"); + printf(" --save_file -sf : save_file \n"); + printf(" ----fileName -fn : file_name \n"); } -int32_t main(int32_t argc, char* argv[]) +bool HandleConfigArgs(argc, argv, config) { - if (argc > 50) { // 50: max args size - printf("error too many args.\n"); - return 0; + return !HandleBooleanConfigArgs(argc, argv, config) && + !HandleIntegetConfigArgs(argc, argv, config) && + !HandleStringConfigArgs(argc, argv, config); +} + +bool HandleBooleanConfigArgs(int argc, char* argv[], std::shared_ptr& config) +{ + if ((arg == "--mallocDisable") || (arg == "-mad")) { + config->mallocDisable_ = true; + } else if ((arg == "--mmapDisable") || (arg == "-mmd")) { + config->mmapDisable_ = true; + } else if ((arg == "--freeStackData") || (arg == "-fsd")) { + config->freeStackData_ = true; + } else if ((arg == "--munmapStackData") || (arg == "-musd")) { + config->munmapStackData_ = true; + } else if ((arg == "--disable_stringCompressed") || (arg == "-sc")) { + config->stringCompressed_ = false; + } else if ((arg == "--dwarf") || (arg == "-df")) { + config->fpUnwind_ = false; + } else if ((arg == "--disable_blocked") || (arg == "-b")) { + config->blocked_ = false; + } else if ((arg == "--disable_recordAccurately") || (arg == "-ra")) { + config->recordAccurately_ = false; + } else if ((arg == "--startupMode") || (arg == "-sm")) { + config->startupMode_ = true; + } else if ((arg == "--memtraceEnable") || (arg == "-me")) { + config->memtraceEnable_ = true; + } else if ((arg == "--onlineSymbolization") || (arg == "-os")) { + config->offlineSymbolization_ = false; + } else if ((arg == "--callframeCompress") || (arg == "-cc")) { + config->callframeCompress_ = true; + } else if ((arg == "--responseLibraryMode") || (arg == "-r")) { + config->responseLibraryMode_ = true; + } else if ((arg == "--printNmd") || (arg == "-nmd")) { + config->printNmd_ = true; + } else if ((arg == "--hookstandalone") || (arg == "-hsa")) { + config->hookstandalone_ = true; + } else if ((arg == "--save_file") || (arg == "-sf")) { + config->saveFile_ = true; + } else { + return false; } - std::shared_ptr config = std::make_shared(); - bool start = false; - bool stop = false; - bool error = false; - bool dumpData = false; - for (int32_t i = 1; i < argc; ++i) { - std::string arg(argv[i]); - if (arg == "--help" || arg == "-h") { - printf(" --start -s : start, default: false\n"); - printf(" --stop -k : stop, default: false\n"); - printf(" --pid -p : pid\n"); - printf(" --filePath -f : filePath, default: "); - printf("/data/local/tmp/hiprofiler_data.htrace\n"); - printf(" --duration -d : duration, default: 20s\n"); - printf(" --filterSize -fs : filterSize, default: 0\n"); - printf(" --shareMemorySize -sms : shareMemorySize, default: 16384\n"); - printf(" --processName -pn : processName\n"); - printf(" --maxStackDepth -msd : maxStackDepth, default: 30\n"); - printf(" --mallocDisable -mad : mallocDisable, default: false\n"); - printf(" --mmapDisable -mmd : mmapDisable, default: false\n"); - printf(" --freeStackData -fsd : freeStackData, default: false\n"); - printf(" --munmapStackData -musd : munmapStackData, default: false\n"); - printf(" --mallocFreeMatchingInterval -mfmi : mallocFreeMatchingInterval\n"); - printf(" --mallocFreeMatchingCnt -mfmc : mallocFreeMatchingCnt\n"); - printf(" --disable_stringCompressed -sc : disable_stringCompressed, "); - printf("default: stringCompressed\n"); - printf(" --dwarf -df : dwarf unwind, default: fp\n"); - printf(" --disable_blocked -b : disable_blocked, default: blocked\n"); - printf(" --disable_recordAccurately -ra : disable_recordAccurately, "); - printf("default: recordAccurately\n"); - printf(" --startupMode -sm : startupMode, default: false\n"); - printf(" --memtraceEnable -me : memtraceEnable, default: false\n"); - printf(" --offlineSymbolization -os : offlineSymbolization, default: false\n"); - printf(" --callframeCompress -cc : callframeCompress, default: false\n"); - printf(" --statisticsInterval -si : statisticsInterval\n"); - printf(" --clockId -c : clockId\n"); - printf(" --dumpData -dd : dump data\n"); - printf(" --sampleInterval -spi : sampleInterval, default: 0\n"); - printf(" --jsStackReport -jr : jsStackReport, default: 0\n"); - printf(" --maxJsStackDepth -mjsd : maxJsStackDepth, default: 0\n"); - printf(" --filterNapiName -fnapi : filterNapiName \n"); - printf(" --hookstandalone -hsa : hookstandalone \n"); - printf(" --save_file -sf : save_file \n"); - printf(" ----fileName -fn : file_name \n"); - return 0; - } + return true; +} - if ((arg == "--start") || (arg == "-s")) { - start = true; - } else if ((arg == "--stop") || (arg == "-k")) { - stop = true; - } else if ((arg == "--pid") || (arg == "-p")) { - config->pid_ = i + 1 < argc && IsNumeric(argv[i + 1]) ? std::stoi(argv[++i]) : 0; - } else if ((arg == "--filePath") || (arg == "-f")) { - config->filePath_ = i + 1 < argc ? std::string(argv[++i]) : ""; - } else if ((arg == "--duration") || (arg == "-d")) { - config->duration_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--filterSize") || (arg == "-fs")) { - config->filterSize_ = i + 1 < argc && IsNumeric(argv[i + 1]) ? std::stoi(argv[++i]) : 0; - } else if ((arg == "--shareMemorySize") || (arg == "-sms")) { - config->shareMemorySize_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--processName") || (arg == "-pn")) { - config->processName_ = i + 1 < argc ? std::string(argv[++i]) : ""; - } else if ((arg == "--maxStackDepth") || (arg == "-msd")) { - config->maxStackDepth_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--mallocDisable") || (arg == "-mad")) { - config->mallocDisable_ = true; - } else if ((arg == "--mmapDisable") || (arg == "-mmd")) { - config->mmapDisable_ = true; - } else if ((arg == "--freeStackData") || (arg == "-fsd")) { - config->freeStackData_ = true; - } else if ((arg == "--munmapStackData") || (arg == "-musd")) { - config->munmapStackData_ = true; - } else if ((arg == "--mallocFreeMatchingInterval") || (arg == "-mfmi")) { - config->mallocFreeMatchingInterval_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--mallocFreeMatchingCnt") || (arg == "-mfmc")) { - config->mallocFreeMatchingCnt_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--disable_stringCompressed") || (arg == "-sc")) { - config->stringCompressed_ = false; - } else if ((arg == "--dwarf") || (arg == "-df")) { - config->fpUnwind_ = false; - } else if ((arg == "--disable_blocked") || (arg == "-b")) { - config->blocked_ = false; - } else if ((arg == "--disable_recordAccurately") || (arg == "-ra")) { - config->recordAccurately_ = false; - } else if ((arg == "--startupMode") || (arg == "-sm")) { - config->startupMode_ = true; - } else if ((arg == "--memtraceEnable") || (arg == "-me")) { - config->memtraceEnable_ = true; - } else if ((arg == "--onlineSymbolization") || (arg == "-os")) { - config->offlineSymbolization_ = false; - } else if ((arg == "--callframeCompress") || (arg == "-cc")) { - config->callframeCompress_ = true; - } else if ((arg == "--statisticsInterval") || (arg == "-si")) { - config->statisticsInterval_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--clockId") || (arg == "-c")) { - config->clockId_ = i + 1 < argc && IsNumeric(argv[i + 1]) ? std::stoi(argv[++i]) : 0; - } else if ((arg == "--dumpData") || (arg == "-dd")) { - dumpData = true; - } else if ((arg == "--sampleInterval ") || (arg == "-spi")) { - config->sampleInterval_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--responseLibraryMode") || (arg == "-r")) { - config->responseLibraryMode_ = true; - } else if ((arg == "--printNmd") || (arg == "-nmd")) { - config->printNmd_ = true; - } else if ((arg == "--jsStackReport") || (arg == "-jr")) { - config->jsStackReport_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--maxJsStackDepth") || (arg == "-mjsd")) { - config->maxJsStackDepth_ = - i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; - } else if ((arg == "--filterNapiName") || (arg == "-fnapi")) { - config->filterNapiName_ = i + 1 < argc ? std::string(argv[i + 1]) : ""; - } else if ((arg == "--hookstandalone") || (arg == "-hsa")) { - config->hookstandalone_ = true; - } else if ((arg == "--save_file") || (arg == "-sf")) { - config->saveFile_ = true; - } else if ((arg == "--fileName") || (arg == "-fn")) { - config->fileName_ = i + 1 < argc ? std::string(argv[++i]) : ""; - } else { - printf("error arg: %s\n", arg.c_str()); - error = true; - break; - } +bool HandleIntegetConfigArgs(int argc, char* argv[], std::shared_ptr& config) +{ + if ((arg == "--pid") || (arg == "-p")) { + config->pid_ = i + 1 < argc && IsNumeric(argv[i + 1]) ? std::stoi(argv[++i]) : 0; + } else if ((arg == "--duration") || (arg == "-d")) { + config->duration_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--filterSize") || (arg == "-fs")) { + config->filterSize_ = i + 1 < argc && IsNumeric(argv[i + 1]) ? std::stoi(argv[++i]) : 0; + } else if ((arg == "--shareMemorySize") || (arg == "-sms")) { + config->shareMemorySize_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--maxStackDepth") || (arg == "-msd")) { + config->maxStackDepth_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--mallocFreeMatchingInterval") || (arg == "-mfmi")) { + config->mallocFreeMatchingInterval_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--mallocFreeMatchingCnt") || (arg == "-mfmc")) { + config->mallocFreeMatchingCnt_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--statisticsInterval") || (arg == "-si")) { + config->statisticsInterval_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--clockId") || (arg == "-c")) { + config->clockId_ = i + 1 < argc && IsNumeric(argv[i + 1]) ? std::stoi(argv[++i]) : 0; + } else if ((arg == "--sampleInterval ") || (arg == "-spi")) { + config->sampleInterval_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--jsStackReport") || (arg == "-jr")) { + config->jsStackReport_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else if ((arg == "--maxJsStackDepth") || (arg == "-mjsd")) { + config->maxJsStackDepth_ = + i + 1 < argc && IsNumeric(argv[i + 1]) ? static_cast(std::stoi(argv[++i])) : 0; + } else { + return false; } + return true; +} - if (error) { - return 0; +bool HandleStringConfigArgs(int argc, char* argv[], std::shared_ptr& config) +{ + if ((arg == "--filePath") || (arg == "-f")) { + config->filePath_ = i + 1 < argc ? std::string(argv[++i]) : ""; + } else if ((arg == "--processName") || (arg == "-pn")) { + config->processName_ = i + 1 < argc ? std::string(argv[++i]) : ""; + } else if ((arg == "--filterNapiName") || (arg == "-fnapi")) { + config->filterNapiName_ = i + 1 < argc ? std::string(argv[i + 1]) : ""; + } else if ((arg == "--fileName") || (arg == "-fn")) { + config->fileName_ = i + 1 < argc ? std::string(argv[++i]) : ""; + } else { + return false; } + return true; +} +void ClientManagerOperations(bool start, bool stop, bool dumpData, + std::shared_ptr& config) +{ if (start) { std::cout << "start....." << std::endl; if (config->printNmd_) { @@ -214,5 +217,42 @@ int32_t main(int32_t argc, char* argv[]) } else { printf("The start or stop parameter is not configured.\n"); } +} +} + +int32_t main(int32_t argc, char* argv[]) +{ + if (argc > 50) { // 50: max args size + printf("error too many args.\n"); + return 0; + } + std::shared_ptr config = std::make_shared(); + bool start = false; + bool stop = false; + bool error = false; + bool dumpData = false; + for (int32_t i = 1; i < argc; ++i) { + std::string arg(argv[i]); + if (arg == "--help" || arg == "-h") { + PrintHelpMessage(); + return 0; + } + if ((arg == "--start") || (arg == "-s")) { + start = true; + } else if ((arg == "--stop") || (arg == "-k")) { + stop = true; + } else if ((arg == "--dumpData") || (arg == "-dd")) { + dumpData = true; + } else if (!HandleConfigArgs(argc, argv, config)){ + printf("error arg: %s\n", arg.c_str()); + error = true; + break; + } + } + + if (error) { + return 0; + } + ClientManagerOperations(start, stop, dumpData, config); return 0; } \ No newline at end of file diff --git a/device/plugins/native_daemon/src/main.cpp b/device/plugins/native_daemon/src/main.cpp index f1ab8cb2a..52c921676 100644 --- a/device/plugins/native_daemon/src/main.cpp +++ b/device/plugins/native_daemon/src/main.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) Huawei Technologies Co., Ltd. 2021-2023. All rights reserved. + * Copyright (c) Huawei Technologies Co., Ltd. 2021-2025. 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 @@ -46,145 +46,238 @@ bool ProcessExist(const std::string pid) return true; } +bool HandleFileOutput(const std::string& value, HookData& hookData) +{ + hookData.fileName = value.c_str(); + return true; +} + +bool HandleProcessIds(const std::string& value, HookData& hookData) +{ + std::vector pids = StringSplit(value, ","); + hookData.pids.insert(pids.begin(), pids.end()); + for (auto iter = hookData.pids.begin(); iter != hookData.pids.end();) { + if (!ProcessExist(*iter)) { + iter = hookData.pids.erase(iter); + printf("process does not exist %s\n", iter->c_str()); + } else { + ++iter; + } + } + if (hookData.pids.empty()) { + printf("all process does not exist\n"); + return false; + } + return true; +} + +bool HandleProcessName(const std::string& value, HookData& hookData) +{ + hookData.processName = value; + return true; +} + +bool HandleSharedMemorySize(const std::string& value, HookData& hookData) +{ + hookData.smbSize = static_cast(IsDigits(value) ? std::stoi(value) : 0); + if (std::to_string(hookData.smbSize) != value) { + return false; + } + return true; +} + +bool HandleFilterSize(const std::string& value, HookData& hookData) +{ + hookData.filterSize = static_cast(IsDigits(value) ? std::stoi(value) : 0); + if (std::to_string(hookData.filterSize) != value) { + return false; + } + if (hookData.filterSize > MAX_UNWIND_DEPTH) { + printf("set max depth = %d\n", MAX_UNWIND_DEPTH); + } + return true; +} + +bool HandleMaxStackDepth(const std::string& value, HookData& hookData) +{ + hookData.maxStackDepth = static_cast(IsDigits(value) ? std::stoi(value) : 0); + if (std::to_string(hookData.maxStackDepth) != value) { + return false; + } + return true; +} + +bool HandleDuration(const std::string& value, HookData& hookData) +{ + hookData.duration = std::stoull(value); + return true; +} + +bool HandlePerformanceFilename(const std::string& value, HookData& hookData) +{ + hookData.performanceFilename = value; + return true; +} + +bool HandleUnwindMode(const std::string& value, HookData& hookData) +{ + if (value == "dwarf") { + hookData.fpUnwind = false; + } else if (value == "fp") { + hookData.fpUnwind = true; + } else { + return false; + } + printf("set unwind mode:%s\n", value.c_str()); + return true; +} + +bool HandleStatisticsInterval(const std::string& value, HookData& hookData) +{ + hookData.statisticsInterval = static_cast(IsDigits(value) ? std::stoi(value) : 0); + if (std::to_string(hookData.statisticsInterval) != value) { + return false; + } + return true; +} + +bool HandleSampleInterval(const std::string& value, HookData& hookData) +{ + hookData.sampleInterval = static_cast(IsDigits(value) ? std::stoi(value) : 0); + if (std::to_string(hookData.sampleInterval) != value) { + return false; + } + return true; +} + +bool HandleOfflineSymbolization(const std::string& value, HookData& hookData) +{ + if (value == "false") { + hookData.offlineSymbolization = false; + } else if (value == "true") { + hookData.offlineSymbolization = true; + } else { + return false; + } + printf("set offlineSymbolization mode:%s\n", value.c_str()); + return true; +} + +bool HandleCallframeCompress(const std::string& value, HookData& hookData) +{ + if (value == "false") { + hookData.callframeCompress = false; + } else if (value == "true") { + hookData.callframeCompress = true; + } else { + return false; + } + printf("set callframeCompress mode:%s\n", value.c_str()); + return true; +} + +bool HandleStringCompressed(const std::string& value, HookData& hookData) +{ + if (value == "false") { + hookData.stringCompressed = false; + } else if (value == "true") { + hookData.stringCompressed = true; + } else { + return false; + } + printf("set stringCompressed mode:%s\n", value.c_str()); + return true; +} + +bool HandleRawString(const std::string& value, HookData& hookData) +{ + if (value == "false") { + hookData.rawString = false; + } else if (value == "true") { + hookData.rawString = true; + } else { + return false; + } + printf("set rawString mode:%s\n", value.c_str()); + return true; +} + +bool HandleResponseLibraryMode(const std::string& value, HookData& hookData) +{ + if (value == "false") { + hookData.responseLibraryMode = false; + } else if (value == "true") { + hookData.responseLibraryMode = true; + } else { + return false; + } + printf("set responseLibraryMode mode:%s\n", value.c_str()); + return true; +} + +bool HandleJsStackReport(const std::string& value, HookData& hookData) +{ + hookData.jsStackReport = IsDigits(value) ? std::stoi(value) : 0; + if (std::to_string(hookData.jsStackReport) != value) { + return false; + } + return true; +} + +bool HandleMaxJsStackDepth(const std::string& value, HookData& hookData) +{ + hookData.maxJsStackdepth = static_cast(IsDigits(value) ? std::stoi(value) : 0); + if (std::to_string(hookData.maxJsStackdepth) != value) { + return false; + } + return true; +} + +bool HandleFilterNapiName(const std::string& value, HookData& hookData) +{ + hookData.filterNapiName = value; + return true; +} + +bool HandleMallocFreeMatchingInterval(const std::string& value, HookData& hookData) +{ + hookData.mallocFreeMatchingInterval = static_cast(IsDigits(value) ? std::stoi(value) : 0); + if (std::to_string(hookData.mallocFreeMatchingInterval) != value) { + return false; + } + return true; +} + +#define HANDLE_PARAM(param, handler) \ + if (args[idx] == param) { \ + if (!handler(args[idx + 1], hookData)) return false; \ + } + bool ParseCommand(const std::vector& args, HookData& hookData) { size_t idx = 0; while (idx < args.size()) { - if (args[idx] == "-o") { - hookData.fileName = args[idx + 1].c_str(); - } else if (args[idx] == "-p") { - std::vector pids = StringSplit(args[idx + 1], ","); - hookData.pids.insert(pids.begin(), pids.end()); - for (auto iter = hookData.pids.begin(); iter != hookData.pids.end();) { - if (!ProcessExist(*iter)) { - iter = hookData.pids.erase(iter); - printf("process does not exist %s\n", iter->c_str()); - } else { - ++iter; - } - } - if (hookData.pids.empty()) { - printf("all process does not exist\n"); - return false; - } - } else if (args[idx] == "-n") { - hookData.processName = args[idx + 1]; - } else if (args[idx] == "-s") { - hookData.smbSize = static_cast(IsDigits(args[idx + 1]) ? std::stoi(args[idx + 1]) : 0); - if (std::to_string(hookData.smbSize) != args[idx + 1]) { - return false; - } - } else if (args[idx] == "-f") { - hookData.filterSize = static_cast(IsDigits(args[idx + 1]) ? std::stoi(args[idx + 1]) : 0); - if (std::to_string(hookData.filterSize) != args[idx + 1]) { - return false; - } - if (hookData.filterSize > MAX_UNWIND_DEPTH) { - printf("set max depth = %d\n", MAX_UNWIND_DEPTH); - } - } else if (args[idx] == "-d") { - hookData.maxStackDepth = static_cast(IsDigits(args[idx + 1]) ? std::stoi(args[idx + 1]) : 0); - if (std::to_string(hookData.maxStackDepth) != args[idx + 1]) { - return false; - } - } else if (args[idx] == "-L") { - if (idx + 1 < args.size()) { - hookData.duration = std::stoull(args[idx + 1]); - } - } else if (args[idx] == "-F") { - if (idx + 1 < args.size()) { - hookData.performanceFilename = args[idx + 1]; - } - } else if (args[idx] == "-u") { - std::string unwind = args[idx + 1]; - if (unwind == "dwarf") { - hookData.fpUnwind = false; - } else if (unwind == "fp") { - hookData.fpUnwind = true; - } else { - return false; - } - printf("set unwind mode:%s\n", unwind.c_str()); - } else if (args[idx] == "-S") { - hookData.statisticsInterval = static_cast(IsDigits(args[idx + 1]) ? - std::stoi(args[idx + 1]) : 0); - if (std::to_string(hookData.statisticsInterval) != args[idx + 1]) { - return false; - } - } else if (args[idx] == "-i") { - hookData.sampleInterval = static_cast(IsDigits(args[idx + 1]) ? std::stoi(args[idx + 1]) : 0); - if (std::to_string(hookData.sampleInterval) != args[idx + 1]) { - return false; - } - } else if (args[idx] == "-O") { - std::string offline = args[idx + 1]; - if (offline == "false") { - hookData.offlineSymbolization = false; - } else if (offline == "true") { - hookData.offlineSymbolization = true; - } else { - return false; - } - printf("set offlineSymbolization mode:%s\n", offline.c_str()); - } else if (args[idx] == "-C") { - std::string callframeCompress = args[idx + 1]; - if (callframeCompress == "false") { - hookData.callframeCompress = false; - } else if (callframeCompress == "true") { - hookData.callframeCompress = true; - } else { - return false; - } - printf("set callframeCompress mode:%s\n", callframeCompress.c_str()); - } else if (args[idx] == "-c") { - std::string stringCompressed = args[idx + 1]; - if (stringCompressed == "false") { - hookData.stringCompressed = false; - } else if (stringCompressed == "true") { - hookData.stringCompressed = true; - } else { - return false; - } - printf("set stringCompressed mode:%s\n", stringCompressed.c_str()); - } else if (args[idx] == "-r") { - std::string rawString = args[idx + 1]; - if (rawString == "false") { - hookData.rawString = false; - } else if (rawString == "true") { - hookData.rawString = true; - } else { - return false; - } - printf("set rawString mode:%s\n", rawString.c_str()); - } else if (args[idx] == "-so") { - std::string rawString = args[idx + 1]; - if (rawString == "false") { - hookData.responseLibraryMode = false; - } else if (rawString == "true") { - hookData.responseLibraryMode = true; - } else { - return false; - } - printf("set responseLibraryMode mode:%s\n", rawString.c_str()); - } else if (args[idx] == "-js") { - hookData.jsStackReport = IsDigits(args[idx + 1]) ? std::stoi(args[idx + 1]) : 0; - if (std::to_string(hookData.jsStackReport) != args[idx + 1]) { - return false; - } - } else if (args[idx] == "-jsd") { - hookData.maxJsStackdepth = static_cast(IsDigits(args[idx + 1]) ? std::stoi(args[idx + 1]) : 0); - if (std::to_string(hookData.maxJsStackdepth) != args[idx + 1]) { - return false; - } - } else if (args[idx] == "-jn") { - hookData.filterNapiName = args[idx + 1]; - } else if (args[idx] == "-mfm") { - hookData.mallocFreeMatchingInterval = static_cast(IsDigits(args[idx + 1]) ? - std::stoi(args[idx + 1]) : 0); - if (std::to_string(hookData.mallocFreeMatchingInterval) != args[idx + 1]) { - return false; - } - } else { + HANDLE_PARAM("-o", HandleFileOutput) + else HANDLE_PARAM("-p", HandleProcessIds) + else HANDLE_PARAM("-n", HandleProcessName) + else HANDLE_PARAM("-s", HandleSharedMemorySize) + else HANDLE_PARAM("-f", HandleFilterSize) + else HANDLE_PARAM("-d", HandleMaxStackDepth) + else HANDLE_PARAM("-L", HandleDuration) + else HANDLE_PARAM("-F", HandlePerformanceFilename) + else HANDLE_PARAM("-u", HandleUnwindMode) + else HANDLE_PARAM("-S", HandleStatisticsInterval) + else HANDLE_PARAM("-i", HandleSampleInterval) + else HANDLE_PARAM("-O", HandleOfflineSymbolization) + else HANDLE_PARAM("-C", HandleCallframeCompress) + else HANDLE_PARAM("-c", HandleStringCompressed) + else HANDLE_PARAM("-r", HandleRawString) + else HANDLE_PARAM("-so", HandleResponseLibraryMode) + else HANDLE_PARAM("-js", HandleJsStackReport) + else HANDLE_PARAM("-jsd", HandleMaxJsStackDepth) + else HANDLE_PARAM("-jn", HandleFilterNapiName) + else HANDLE_PARAM("-mfm", HandleMallocFreeMatchingInterval) + else { printf("args[%zu] = %s\n", idx, args[idx].c_str()); return false; } @@ -217,9 +310,19 @@ void SignalSigintHandler(int sig) g_isRunning = false; } -void GetHookedProceInfo(HookData& hookData) +void PrintHookInfo(const HookData& hookData) { printf("Record file = %s, apply sharememory size = %u\n", hookData.fileName.c_str(), hookData.smbSize); + if (hookData.maxStackDepth > 0) { + printf("depth greater than %u will not display\n", hookData.maxStackDepth); + } + if (hookData.filterSize > 0) { + printf("malloc size smaller than %u will not record\n", hookData.filterSize); + } +} + +void HandleProcessInfo(HookData& hookData) +{ if (hookData.pids.size() > 0) { for (const auto& pid : hookData.pids) { printf("hook target process %s start\n", pid.c_str()); @@ -235,14 +338,10 @@ void GetHookedProceInfo(HookData& hookData) hookData.pids.emplace(std::to_string(pidValue)); } } +} - if (hookData.maxStackDepth > 0) { - printf("depth greater than %u will not display\n", hookData.maxStackDepth); - } - if (hookData.filterSize > 0) { - printf("malloc size smaller than %u will not record\n", hookData.filterSize); - } - +void RunHookLoop(HookData& hookData) +{ if (!OHOS::Developtools::Profiler::Hook::StartHook(hookData)) { return; } @@ -251,6 +350,148 @@ void GetHookedProceInfo(HookData& hookData) } OHOS::Developtools::Profiler::Hook::EndHook(); } + +void GetHookedProceInfo(HookData& hookData) +{ + PrintHookInfo(hookData); + HandleProcessInfo(hookData); + RunHookLoop(hookData); +} + +void ReleaseLockFile(int lockFileFd) +{ + if (lockFileFd > 0) { + flock(lockFileFd, LOCK_UN); + close(lockFileFd); + } +} + +bool StartServiceMode() +{ + if (!OHOS::Developtools::NativeDaemon::NativeMemoryProfilerSaService::StartServiceAbility()) { + return false; + } + while (true) { + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_ONE_SECOND)); + } + return true; +} + +bool CheckDeveloperModeAndBetaVersion() +{ + if (!COMMON::GetDeveloperMode()) { + return false; + } + if (!COMMON::IsBetaVersion()) { + printf("memory profiler only support in beta version\n"); + return false; + } + return true; +} + +void PrintHelpInfo() +{ + std::string help = R"(Usage: native_daemon + [-o file] + [-s smb_size] + <-n process_name> + <-p pids> + <-f filter_size> + <-d max_stack_depth> + <-i sample_interval> + <-u fp|dwarf> + <-S statistics_interval> + <-O offline_symbolization true|false> + <-C callframe_compress true|false> + <-c string_compressed true|false> + <-r raw_string true|false> + <-so responseLibraryMode true|false> + <-js jsStackReport> + <-jsd maxJsStackDepth> + <-jn filterNapiName> + <-mfm mallocFreeMatchingInterval_> + )"; + printf("%s\n", help.c_str()); +} + +bool HandleCommandMode(int argc, char* argv[], int lockFileFd) +{ + if (!CheckDeveloperModeAndBetaVersion()) { + ReleaseLockFile(lockFileFd); + return false; + } + + std::vector args; + for (int i = 1; i < argc; i++) { + args.push_back(argv[i]); + } + + HookData hookData; + if (VerifyCommand(args, hookData)) { + signal(SIGINT, SignalSigintHandler); + GetHookedProceInfo(hookData); + return true; + } else { + PrintHelpInfo(); + ReleaseLockFile(lockFileFd); + return false; + } +} + +bool InitializeHookManager(std::shared_ptr& hookManager) +{ + hookManager = std::make_shared(); + if (hookManager == nullptr) { + PROFILER_LOG_INFO(LOG_CORE, "create PluginManager FAILED!"); + return false; + } + return true; +} + +bool InitializeCommandPoller(std::shared_ptr hookManager, + std::shared_ptr& commandPoller) +{ + commandPoller = std::make_shared(hookManager); + if (commandPoller == nullptr) { + PROFILER_LOG_INFO(LOG_CORE, "create CommandPoller FAILED!"); + return false; + } + + if (!commandPoller->OnConnect()) { + PROFILER_LOG_INFO(LOG_CORE, "connect FAILED"); + return false; + } + + hookManager->SetCommandPoller(commandPoller); + hookManager->RegisterAgentPlugin("nativehook"); + return true; +} + +bool RunDaemonMode(int lockFileFd) +{ + if (!COMMON::GetDeveloperMode()) { + ReleaseLockFile(lockFileFd); + return false; + } + + auto hookManager = std::make_shared(); + if (!InitializeHookManager(hookManager)) { + ReleaseLockFile(lockFileFd); + return false; + } + + auto commandPoller = std::make_shared(hookManager); + if (!InitializeCommandPoller(hookManager, commandPoller)) { + ReleaseLockFile(lockFileFd); + return false; + } + + while (true) { + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_ONE_SECOND)); + } + return true; +} + } // namespace int main(int argc, char* argv[]) @@ -262,116 +503,21 @@ int main(int argc, char* argv[]) if (argc > 1) { if (argc == 2 && strcmp(argv[1], "sa") == 0) { // 2: argc size - if (!OHOS::Developtools::NativeDaemon::NativeMemoryProfilerSaService::StartServiceAbility()) { - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - } + if (!StartServiceMode()) { + ReleaseLockFile(lockFileFd); return 0; } - while (true) { - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_ONE_SECOND)); - } } else { - if (!COMMON::GetDeveloperMode()) { - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - } - return 0; - } - if (!COMMON::IsBetaVersion()) { - printf("memory profiler only support in beta version\n"); - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - } - return 0; - } - std::vector args; - for (int i = 1; i < argc; i++) { - args.push_back(argv[i]); - } - HookData hookData; - if (VerifyCommand(args, hookData)) { - signal(SIGINT, SignalSigintHandler); - GetHookedProceInfo(hookData); - } else { - std::string help = R"(Usage: native_daemon - [-o file] - [-s smb_size] - <-n process_name> - <-p pids> - <-f filter_size> - <-d max_stack_depth> - <-i sample_interval> - <-u fp|dwarf> - <-S statistics_interval> - <-O offline_symbolization true|false> - <-C callframe_compress true|false> - <-c string_compressed true|false> - <-r raw_string true|false> - <-so responseLibraryMode true|false> - <-js jsStackReport> - <-jsd maxJsStackDepth> - <-jn filterNapiName> - <-mfm mallocFreeMatchingInterval_> - )"; - printf("%s\n", help.c_str()); - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - } + if (!HandleCommandMode(argc, argv, lockFileFd)) { return 0; } } } else { - if (!COMMON::GetDeveloperMode()) { - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - } - return 0; - } - auto hookManager = std::make_shared(); - if (hookManager == nullptr) { - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - PROFILER_LOG_INFO(LOG_CORE, "create PluginManager FAILED!"); - return 1; - } - return 0; - } - auto commandPoller = std::make_shared(hookManager); - if (commandPoller == nullptr) { - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - PROFILER_LOG_INFO(LOG_CORE, "create CommandPoller FAILED!"); - return 1; - } - return 0; + if (!RunDaemonMode(lockFileFd)) { + return 1; } - if (!commandPoller->OnConnect()) { - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); - PROFILER_LOG_INFO(LOG_CORE, "connect FAILED"); - return 1; - } - return 0; - } - hookManager->SetCommandPoller(commandPoller); - hookManager->RegisterAgentPlugin("nativehook"); - - while (true) { - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_ONE_SECOND)); - } - } - if (lockFileFd > 0) { - flock(lockFileFd, LOCK_UN); - close(lockFileFd); } + + ReleaseLockFile(lockFileFd); return 0; } \ No newline at end of file -- Gitee