diff --git a/pmu/pmu_analysis.cpp b/pmu/pmu_analysis.cpp index 8ff661ebdcacc2180584265afca3b5b6fd91dd37..2dbbce303fb1159eeee2bd356587206430ac99ce 100644 --- a/pmu/pmu_analysis.cpp +++ b/pmu/pmu_analysis.cpp @@ -65,23 +65,30 @@ namespace KUNPENG_PMU { } string line; + const std::string perfixDefineNr = "#define __NR_"; + const std::string perfixDefineNr3264 = "#define __NR3264_"; + size_t nameStart = 0; while (getline(syscallFile, line)) { - if (line.find("#define __NR_") == 0) { - size_t nameStart = line.find("__NR_") + 5; // "__NR_" len is 5 - size_t nameEnd = line.find(' ', nameStart); - size_t numberStart = line.find_last_of(' ') + 1; - - if (nameStart != string::npos && nameEnd != string::npos && numberStart != string::npos) { - string funName = line.substr(nameStart, nameEnd - nameStart); - string numberStr = line.substr(numberStart); // get the number of NR_SYSCALL - - try { - int syscallNumber = stoi(numberStr); - syscallTable[syscallNumber] = funName; - } catch (const invalid_argument& e) { - // Handle invalid argument exception - continue; - } + if (line.compare(0, perfixDefineNr.length(), perfixDefineNr) == 0) { + nameStart = perfixDefineNr.length(); + } else if (line.compare(0, perfixDefineNr3264.length(), perfixDefineNr3264) == 0) { + nameStart = perfixDefineNr3264.length(); + } else { + continue; // skip line if it doesn't start with perfixDefineNr or perfixDefineNr3264 + } + size_t nameEnd = line.find(' ', nameStart); + size_t numberStart = line.find_last_of(' ') + 1; + + if (nameStart != string::npos && nameEnd != string::npos && numberStart != string::npos) { + string funName = line.substr(nameStart, nameEnd - nameStart); + string numberStr = line.substr(numberStart); // get the number of NR_SYSCALL + + try { + int syscallNumber = stoi(numberStr); + syscallTable[syscallNumber] = funName; + } catch (const invalid_argument& e) { + // Handle invalid argument exception + continue; } } } @@ -155,6 +162,8 @@ namespace KUNPENG_PMU { static const char *GetRawSysCallName(long NR_SYSCALL) { + // already test checked that all syscall numbers is in the syscall table. + // so we can use it directly. return syscallTable[NR_SYSCALL].c_str(); } diff --git a/pmu/pmu_trace_analysis.cpp b/pmu/pmu_trace_analysis.cpp index a7c28e9e675984966abae4eb673ecf75c80af7ab..7dbf4dace9a558f1db1b0dfb5b318ff5273c4cfc 100644 --- a/pmu/pmu_trace_analysis.cpp +++ b/pmu/pmu_trace_analysis.cpp @@ -222,21 +222,29 @@ int PmuTraceRead(int pd, struct PmuTraceData **pmuTraceData) *pmuTraceData = nullptr; return 0; } - if (!PdValid(pd)) { - New(LIBPERF_ERR_INVALID_PD); + try { + if (!PdValid(pd)) { + New(LIBPERF_ERR_INVALID_PD); + return -1; + } + New(SUCCESS); + bool isAllCollect = + (strcmp(pmuData[0].evt, ENTER_RAW_SYSCALL) == 0) || (strcmp(pmuData[0].evt, EXIT_RAW_SYSCALL) == 0); + std::vector& traceData = isAllCollect ? PmuAnalysis::GetInstance()->AnalyzeRawTraceData(pd, pmuData, len) + : PmuAnalysis::GetInstance()->AnalyzeTraceData(pd, pmuData, len); + if (!traceData.empty()) { + *pmuTraceData = traceData.data(); + return traceData.size(); + } else { + *pmuTraceData = nullptr; + return 0; + } + } catch (std::bad_alloc&) { + New(COMMON_ERR_NOMEM); + return -1; + } catch (std::exception& ex) { + New(UNKNOWN_ERROR, ex.what()); return -1; - } - bool isAllCollect = - (strcmp(pmuData[0].evt, ENTER_RAW_SYSCALL) == 0) || (strcmp(pmuData[0].evt, EXIT_RAW_SYSCALL) == 0); - std::vector& traceData = isAllCollect ? PmuAnalysis::GetInstance()->AnalyzeRawTraceData(pd, pmuData, len) - : PmuAnalysis::GetInstance()->AnalyzeTraceData(pd, pmuData, len); - New(SUCCESS); - if (!traceData.empty()) { - *pmuTraceData = traceData.data(); - return traceData.size(); - } else { - *pmuTraceData = nullptr; - return 0; } }