From cbdc48048e3522d79dc59a77867e4acc6a532624 Mon Sep 17 00:00:00 2001 From: xuxiaoqing Date: Sat, 27 May 2023 10:46:56 +0000 Subject: [PATCH] fix: optimize hdf_dbg to print the data in the reply Signed-off-by: xuxiaoqing --- framework/tools/hdf_dbg/hdf_dbg.cpp | 165 ++++++++++++++++++++-------- 1 file changed, 117 insertions(+), 48 deletions(-) diff --git a/framework/tools/hdf_dbg/hdf_dbg.cpp b/framework/tools/hdf_dbg/hdf_dbg.cpp index 3cc85b745..754dab779 100644 --- a/framework/tools/hdf_dbg/hdf_dbg.cpp +++ b/framework/tools/hdf_dbg/hdf_dbg.cpp @@ -6,14 +6,15 @@ * See the LICENSE file in the root of this repository for complete details. */ -#include -#include #include -#include #include #include +#include #include #include +#include +#include +#include #define HDF_LOG_TAG hdf_dbg @@ -31,6 +32,10 @@ static constexpr int32_t DBG_HDI_PARA_MIN_LEN = 7; static constexpr int32_t DBG_HDI_SERVICE_LOAD_IDX = 2; static constexpr int32_t QUERY_INFO_PARA_CNT = 3; static constexpr int32_t ALIGN_SIZE = 30; +static constexpr int32_t PARAM_IN_OUT_SIZE = 2; +static constexpr int32_t PARAM_IN_SIZE = 1; +static constexpr int32_t PARAM_IN_IDX = 0; +static constexpr int32_t PARAM_OUT_IDX = 1; static constexpr const char *HELP_COMMENT = " hdf_dbg menu: \n" " hdf_dbg -h :display help information\n" @@ -42,9 +47,12 @@ static constexpr const char *HELP_COMMENT = " hdf_dbg -d :debug hdi interface\n" " detailed usage:\n" " debug hdi interface, parameterType can be int or string now, for example:\n" - " hdf_dbg -d loadFlag serviceName interfaceToken cmd parameterCount parameterType parameterValue\n" + " hdf_dbg -d loadFlag serviceName interfaceToken cmd parameterInCount parameterInType parameterInValue\n" + " hdf_dbg -d loadFlag serviceName interfaceToken cmd parameterInCount,parameterOutCount parameterInType " + "parameterInValue parameterOutType\n" " detailed examples:\n" " hdf_dbg -d 1 sample_driver_service hdf.test.sampele_service 1 2 int 100 int 200\n" + " hdf_dbg -d 1 sample_driver_service hdf.test.sampele_service 1 2,1 int 100 int 200 int\n" " hdf_dbg -d 0 sample_driver_service hdf.test.sampele_service 7 1 string foo\n"; using GetInfoFunc = void (*)(); @@ -71,6 +79,18 @@ using OHOS::HDI::ServiceManager::V1_0::IServiceManager; using std::cout; using std::endl; +class HdfDbg { +public: + bool loadDevice; + std::string serviceName; + std::u16string descriptor; + int32_t cmd; + int32_t inParam; + int32_t outParam; + std::vector> inParamVec; + std::vector outParamVec; +}; + static void PrintHelp() { cout << HELP_COMMENT; @@ -246,74 +266,123 @@ static void PrintAllDeviceInfoKernel(struct HdfSBuf *data, bool flag) cout << "total " << std::dec << hostCnt << " hosts, " << devNodeCnt << " devNodes in kernel space" << endl; } -static int32_t ParseHdiParameter(int argc, char **argv, MessageParcel &data) +static bool ParseParameterCount(int argc, char **argv, HdfDbg &info) { - std::string TempStr = argv[PARA_CNT_IDX]; - int32_t paraCnt = StrToInt(TempStr); - if ((paraCnt * PARA_MULTIPLE) != (argc - PARA_CNT_IDX - 1)) { - cout << "parameter count error, input: " << paraCnt << " real: " << (argc - PARA_CNT_IDX - 1) << endl; - return HDF_FAILURE; + std::string paramCount = argv[PARA_CNT_IDX]; + std::vector result; + OHOS::SplitStr(paramCount, ",", result); + info.inParam = 0; + info.outParam = 0; + if (result.size() == PARAM_IN_SIZE) { + info.inParam = StrToInt(result[PARAM_IN_IDX]); + } else if (result.size() == PARAM_IN_OUT_SIZE) { + info.inParam = StrToInt(result[PARAM_IN_IDX]); + info.outParam = StrToInt(result[PARAM_OUT_IDX]); + } else { + cout << "parameter count parse failed, input: " << paramCount << + " it should be paramIn,paramOut or paramIn" << endl; + return false; + } + if ((info.inParam * PARA_MULTIPLE + info.outParam) != (argc - PARA_CNT_IDX - 1)) { + cout << "parameter count error, please check your input and output parameters" << endl; + return false; } + return true; +} +static bool ParseParameterIn(int argc, char **argv, HdfDbg &info) +{ int32_t paraTypeIdx = PARA_CNT_IDX + 1; - for (int i = 0; i < paraCnt; i++) { + for (int32_t i = 0; i < info.inParam; i++) { int32_t paraValueIdx = paraTypeIdx + 1; - if (strcmp(argv[paraTypeIdx], "string") == 0) { - data.WriteCString(argv[paraValueIdx]); - } else if (strcmp(argv[paraTypeIdx], "int") == 0) { - std::string TempStr = argv[paraValueIdx]; - data.WriteInt32(StrToInt(TempStr)); - } else { - cout << "parameterType error:" << argv[paraTypeIdx] << endl; - return HDF_FAILURE; + if (strcmp(argv[paraTypeIdx], "string") != 0 && strcmp(argv[paraTypeIdx], "int") != 0) { + cout << "parameterType not support:" << argv[paraTypeIdx] << endl; + return false; } + info.inParamVec.push_back(std::vector()); + info.inParamVec[i].push_back(argv[paraTypeIdx]); + info.inParamVec[i].push_back(argv[paraValueIdx]); paraTypeIdx += PARA_MULTIPLE; } - return HDF_SUCCESS; + return true; } -static int32_t InjectDebugHdi(int argc, char **argv) +static bool ParseParameterOut(int argc, char **argv, HdfDbg &info) { - if (argc < DBG_HDI_PARA_MIN_LEN) { - PrintHelp(); - return HDF_FAILURE; + int32_t paraTypeIdx = PARA_CNT_IDX + 1 + info.inParam * PARA_MULTIPLE; + for (int32_t i = 0; i < info.outParam; i++) { + if (strcmp(argv[paraTypeIdx], "string") != 0 && strcmp(argv[paraTypeIdx], "int") != 0) { + cout << "parameterType not support:" << argv[paraTypeIdx] << endl; + return false; + } + info.outParamVec.push_back(argv[paraTypeIdx]); + paraTypeIdx++; } + return true; +} - auto servmgr = IServiceManager::Get(); - auto devmgr = IDeviceManager::Get(); - std::string TempStr = argv[DBG_HDI_SERVICE_LOAD_IDX]; - int32_t loadFlag = StrToInt(TempStr); - - MessageParcel data; - data.WriteInterfaceToken(OHOS::Str8ToStr16(argv[INTERFACE_DESC_IDX])); +static bool ParseHdfDbg(int argc, char **argv, HdfDbg &info) +{ + if (argc < DBG_HDI_PARA_MIN_LEN) { + return false; + } + info.loadDevice = strcmp(argv[DBG_HDI_SERVICE_LOAD_IDX], "1") == 0 ? true : false; + info.serviceName = argv[SERVER_NAME_IDX]; + info.descriptor = OHOS::Str8ToStr16(argv[INTERFACE_DESC_IDX]); + info.cmd = StrToInt(argv[CMD_ID_IDX]); + if (!ParseParameterCount(argc, argv, info) || !ParseParameterIn(argc, argv, info) || + !ParseParameterOut(argc, argv, info)) { + return false; + } + return true; +} - int32_t ret = ParseHdiParameter(argc, argv, data); - if (ret != HDF_SUCCESS) { +static int32_t InjectDebugHdi(int argc, char **argv) +{ + HdfDbg info; + if (!ParseHdfDbg(argc, argv, info)) { PrintHelp(); return HDF_FAILURE; } - - if (loadFlag == 1) { - devmgr->LoadDevice(argv[SERVER_NAME_IDX]); + auto servmgr = IServiceManager::Get(); + auto devmgr = IDeviceManager::Get(); + if (info.loadDevice) { + devmgr->LoadDevice(info.serviceName); OsalMSleep(WAIT_TIME); } - + MessageParcel data; + data.WriteInterfaceToken(info.descriptor); + for (int32_t i = 0; i < info.inParam; i++) { + if (info.inParamVec[i][0] == "string") { + data.WriteCString(info.inParamVec[i][1].c_str()); + } else { + data.WriteInt32(StrToInt(info.inParamVec[i][1])); + } + } MessageParcel reply; MessageOption option; - std::string SendArgv = argv[CMD_ID_IDX]; - int32_t SendNum = StrToInt(SendArgv); - auto service = servmgr->GetService(argv[SERVER_NAME_IDX]); + int32_t ret = HDF_FAILURE; + auto service = servmgr->GetService(info.serviceName.c_str()); if (service == nullptr) { - cout << "getService " << argv[SERVER_NAME_IDX] << " failed" << endl; + cout << "getService " << info.serviceName << " failed" << endl; goto END; } - ret = service->SendRequest(SendNum, data, reply, option); - cout << "call service " << argv[SERVER_NAME_IDX] << " hdi cmd:" << SendNum << " return:" << ret << endl; + ret = service->SendRequest(info.cmd, data, reply, option); + cout << "call service " << info.serviceName << " hdi cmd:" << info.cmd << " return:" << ret << endl; + for (int32_t i = 0; i < info.outParam; i++) { + if (info.outParamVec[i] == "string") { + cout << "output parameter" << i << ": parameterType is string, parameterValue is " << + reply.ReadCString() << endl; + } else { + int32_t replyInt; + reply.ReadInt32(replyInt); + cout << "output parameter" << i << ": parameterType is int, parameterValue is " << replyInt << endl; + } + } END: - if (loadFlag == 1) { - devmgr->UnloadDevice(argv[SERVER_NAME_IDX]); + if (info.loadDevice) { + devmgr->UnloadDevice(info.serviceName); } - return ret; } @@ -407,8 +476,8 @@ int main(int argc, char **argv) g_getInfoFuncs[GET_INFO_FUNC_NUMS - 1](); return HDF_SUCCESS; } - std::string ArgvStr = argv[QUERY_INFO_PARA_CNT - 1]; - uint32_t queryIdx = static_cast(StrToInt(ArgvStr)); + std::string argvStr = argv[QUERY_INFO_PARA_CNT - 1]; + uint32_t queryIdx = static_cast(StrToInt(argvStr)); if (queryIdx < GET_INFO_FUNC_NUMS - 1) { g_getInfoFuncs[queryIdx](); } else { -- Gitee