diff --git a/interfaces/common/dfx_dump_res.h b/interfaces/common/dfx_dump_res.h index 6d63f9959317f911b6e326a87aca7af43589973c..c42b3cef63c3131ac544020e02db02b1c37c4a53 100644 --- a/interfaces/common/dfx_dump_res.h +++ b/interfaces/common/dfx_dump_res.h @@ -74,6 +74,8 @@ enum DumpErrorCode : int32_t { DUMP_ESYMBOL_NO_PARSE, /** parse symbol timeout */ DUMP_ESYMBOL_PARSE_TIMEOUT, + /** coredump flow just exit*/ + DUMP_COREDUMP, }; class DfxDumpRes { diff --git a/services/coredump/coredump_manager_service.cpp b/services/coredump/coredump_manager_service.cpp index c61155a380a1091b9a3abc344e184db15399ae4f..22134c1159994d19463b02c3dd700fe5d3beca8a 100644 --- a/services/coredump/coredump_manager_service.cpp +++ b/services/coredump/coredump_manager_service.cpp @@ -178,6 +178,7 @@ bool FaultCoredumpConfig::Parse(const std::string& jsonText) cJSON_Delete(root); return false; } + uids.clear(); cJSON* uid = nullptr; cJSON_ArrayForEach(uid, whitelistArray) { diff --git a/test/unittest/coredump/dfx_coredump_writer_test.cpp b/test/unittest/coredump/dfx_coredump_writer_test.cpp index 1570727287bfc6b0792dddb5838a42ab8b7f4e51..fa56e33556013e56b4db3fc75c773af421ba3c3c 100644 --- a/test/unittest/coredump/dfx_coredump_writer_test.cpp +++ b/test/unittest/coredump/dfx_coredump_writer_test.cpp @@ -228,22 +228,44 @@ HWTEST_F(DfxCoreDumpWriterTest, ThreadNoteWriter001, TestSize.Level2) ret = writer.ArmPacMaskWrite(getpid()); EXPECT_FALSE(ret); + bw.capacity_ = 1; + bw.Reset(); + ret = writer.PrstatusWrite(getpid()); + EXPECT_FALSE(ret); + bw.capacity_ = sizeof(prstatus_t) + 1; bw.Reset(); ret = writer.PrstatusWrite(getpid()); EXPECT_FALSE(ret); + bw.capacity_ = 1; + bw.Reset(); + ret = writer.FpregsetWrite(getpid()); + EXPECT_FALSE(ret); + bw.capacity_ = sizeof(user_fpsimd_struct) + 1; bw.Reset(); ret = writer.FpregsetWrite(getpid()); EXPECT_FALSE(ret); + bw.capacity_ = 1; + bw.Reset(); + writer.SiginfoWrite(getpid()); + EXPECT_FALSE(ret); + bw.capacity_ = sizeof(siginfo_t) + 1; bw.Reset(); writer.SiginfoWrite(getpid()); EXPECT_FALSE(ret); + bw.capacity_ = 1; + bw.Reset(); + writer.ArmTaggedAddrCtrlWrite(); + + bw.capacity_ = sizeof(NT_ARM_TAGGED_ADDR_CTRL) + 1; + bw.Reset(); writer.ArmTaggedAddrCtrlWrite(); + GTEST_LOG_(INFO) << "ThreadNoteWriter001: end."; } diff --git a/tools/process_dump/coredump/coredump_dump_generator.cpp b/tools/process_dump/coredump/coredump_dump_generator.cpp index 3f23997289aedbb16fd2d8efb8032f682551f8a6..47f0a53d6cf62e9115cc85927d8647aa81bc49e0 100644 --- a/tools/process_dump/coredump/coredump_dump_generator.cpp +++ b/tools/process_dump/coredump/coredump_dump_generator.cpp @@ -62,7 +62,6 @@ void CoredumpGenerator::FinishCoredump(bool ret) if (CoredumpController::IsHwasanCoredumpEnabled()) { DumpUtils::InfoCrashUnwindResult(request_, true); } - exit(0); } bool CoredumpGenerator::MmapCoredumpFile() diff --git a/tools/process_dump/coredump/coredump_note_segment_writer.cpp b/tools/process_dump/coredump/coredump_note_segment_writer.cpp index 847d0e17704d4cf2a2f3224e88c31615b4ea313a..53a60dc5c0de03bf47bf2e3bb3f0c5c59e4a1766 100644 --- a/tools/process_dump/coredump/coredump_note_segment_writer.cpp +++ b/tools/process_dump/coredump/coredump_note_segment_writer.cpp @@ -209,7 +209,6 @@ bool ThreadNoteWriter::GetPrStatus(prstatus_t &ntPrstatus, pid_t tid) return true; } - bool ThreadNoteWriter::GetRusage(prstatus_t &ntPrstatus) { struct rusage selfUsage; diff --git a/tools/process_dump/coredump/coredump_note_segment_writer.h b/tools/process_dump/coredump/coredump_note_segment_writer.h index d43b734a759234db074fd6319d7bce7bca519b8b..761ecff552d533b6790b51377b30eb4e3067af5a 100644 --- a/tools/process_dump/coredump/coredump_note_segment_writer.h +++ b/tools/process_dump/coredump/coredump_note_segment_writer.h @@ -161,9 +161,9 @@ private: * --------------- * | PT_NOTE | * --------------- - * | NT_PRSTATUS | // process status (registers, etc.) + * | NT_PRPSINFO | // process info (pid, ppid, name, etc.) * --------------- - * | ........... | // thread register .. + * | ........... | // dump each thread core info , detail see ThreadNoteWriter * --------------- * | NT_AUXV | // Auxiliary vector * -------------- diff --git a/tools/process_dump/process_dumper.cpp b/tools/process_dump/process_dumper.cpp index a8a5fcb69b0b0de848a3ada50c2eb245e2d7e1c5..3f67482803564f89dc3d94b5ab1a6ce9a808a688 100644 --- a/tools/process_dump/process_dumper.cpp +++ b/tools/process_dump/process_dumper.cpp @@ -194,6 +194,9 @@ void ProcessDumper::Dump() { startTime_ = GetTimeMillisec(); int resDump = DumpProcess(); + if (resDump == DumpErrorCode::DUMP_COREDUMP) { + return; + } FormatJsonInfoIfNeed(); WriteDumpResIfNeed(resDump); finishTime_ = GetTimeMillisec(); @@ -499,6 +502,8 @@ bool ProcessDumper::InitUnwinder(int &dumpRes) #if defined(__aarch64__) && !defined(is_ohos_lite) if (coredumpManager_) { coredumpManager_->DumpMemoryForPid(vmPid); + dumpRes = DumpErrorCode::DUMP_COREDUMP; + return false; // coredump flow end } #endif process_->SetVmPid(vmPid);