diff --git a/interfaces/common/dfx_socket_request.h b/interfaces/common/dfx_socket_request.h index 6f3f3aba38d3b1825b1c77751a3db73818e96f01..a32f4111f8af5302a6dba2609abe4aec20201637 100644 --- a/interfaces/common/dfx_socket_request.h +++ b/interfaces/common/dfx_socket_request.h @@ -246,6 +246,8 @@ typedef struct FaultLoggerdStatsRequest { int32_t result; /** count of thread in target process */ uint32_t targetProcessThreadCount; + /** write dump info cost time */ + uint32_t writeDumpInfoCost; /** caller elf offset */ uintptr_t offset; char summary[128]; // 128 : max summary size diff --git a/services/fault_logger_service.cpp b/services/fault_logger_service.cpp index 36dc4f9792dc4cd8970b80195220886f181de76c..5f853165b0cd310889b0217ba39c1a14ac8960e6 100644 --- a/services/fault_logger_service.cpp +++ b/services/fault_logger_service.cpp @@ -146,6 +146,7 @@ void StatsService::ReportDumpStats(const DumpStats& stat) "OVERALL_TIME", stat.dumpCatcherFinishTime - stat.requestTime, "SIGNAL_TIME", stat.signalTime - stat.requestTime, "DUMPER_START_TIME", stat.processdumpStartTime - stat.signalTime, + "WRITE_DUMP_INFO_TIME", stat.writeDumpInfoCost, "UNWIND_TIME", stat.processdumpFinishTime - stat.processdumpStartTime, "TARGET_PROCESS_THREAD_COUNT", stat.targetProcessThreadCount); } @@ -173,6 +174,7 @@ int32_t StatsService::OnRequest(const std::string& socketName, int32_t connectio stats.processdumpStartTime = requestData.processdumpStartTime; stats.processdumpFinishTime = requestData.processdumpFinishTime; stats.targetProcessName = requestData.targetProcess; + stats.writeDumpInfoCost = requestData.writeDumpInfoCost; } else if (requestData.type == DUMP_CATCHER) { auto task = [requestData, this] { auto iter = std::find_if(stats_.begin(), stats_.end(), [&requestData](const DumpStats& dumpStats) { diff --git a/services/fault_logger_service.h b/services/fault_logger_service.h index dcd61b4a17d7e7cc39ae2135ff0ddbd8589917eb..9e02228565f7c3d1f3e052916ccca98197594658 100644 --- a/services/fault_logger_service.h +++ b/services/fault_logger_service.h @@ -76,6 +76,7 @@ struct DumpStats { uint64_t dumpCatcherFinishTime = 0; int32_t result = 0; uint32_t targetProcessThreadCount = 0; + uint32_t writeDumpInfoCost = 0; std::string summary; std::string callerProcessName; std::string callerElfName; diff --git a/tools/process_dump/process_dumper.cpp b/tools/process_dump/process_dumper.cpp index aef859e52f87bd6dd1aeb1bc4ac4af51ce13c773..f22eb02cbd3d60492bd8c54246c5b295a53ec392 100644 --- a/tools/process_dump/process_dumper.cpp +++ b/tools/process_dump/process_dumper.cpp @@ -193,11 +193,10 @@ void ProcessDumper::Dump() startTime_ = GetTimeMillisec(); int resDump = DumpProcess(); FormatJsonInfoIfNeed(); + WriteDumpResIfNeed(resDump); finishTime_ = GetTimeMillisec(); ReportSigDumpStats(); - - WriteDumpResIfNeed(resDump); DfxBufferWriter::GetInstance().PrintBriefDumpInfo(); DfxBufferWriter::GetInstance().Finish(); DFXLOGI("Finish dump stacktrace for %{public}s(%{public}d:%{public}d).", @@ -475,6 +474,7 @@ int ProcessDumper::ParseSymbols(std::shared_ptr threadDumpInfo) DFXLOGW("do not parse symbol, remain %{public}" PRId64 "ms", expectedDumpFinishTime_ - curTime); dumpRes = DumpErrorCode::DUMP_ESYMBOL_NO_PARSE; } + finishParseSymbolTime_ = GetTimeMillisec(); return dumpRes; } @@ -673,6 +673,7 @@ void ProcessDumper::ReportSigDumpStats() stat->signalTime = request_.timeStamp; stat->processdumpStartTime = startTime_; stat->processdumpFinishTime = finishTime_ == 0 ? GetTimeMillisec() : finishTime_; + stat->writeDumpInfoCost = finishParseSymbolTime_ > 0 ? stat->processdumpFinishTime - finishParseSymbolTime_ : 0; if (memcpy_s(stat->targetProcess, sizeof(stat->targetProcess), request_.processName, sizeof(request_.processName)) != 0) { DFXLOGE("Failed to copy target processName (%{public}d)", errno); diff --git a/tools/process_dump/process_dumper.h b/tools/process_dump/process_dumper.h index 6a9739d908a7b8eeb1f1db322b3b1749ccba7e94..bd0eb407a98d9ad3cea926218b0f35d4888facb4 100644 --- a/tools/process_dump/process_dumper.h +++ b/tools/process_dump/process_dumper.h @@ -79,6 +79,7 @@ private: #if defined(__aarch64__) std::unique_ptr coreDumpService_ = nullptr; #endif + uint64_t finishParseSymbolTime_ = 0; }; } // namespace HiviewDFX } // namespace OHOS