diff --git a/test/unittest/process_dump/dfx_coredump_test.cpp b/test/unittest/process_dump/dfx_coredump_test.cpp index 3e96d9222048580d53a7ccbd1a5a3df318fb45cf..4a50df9576ee22af1e8f8e28a3fbb6903d95f4ce 100644 --- a/test/unittest/process_dump/dfx_coredump_test.cpp +++ b/test/unittest/process_dump/dfx_coredump_test.cpp @@ -153,4 +153,20 @@ HWTEST_F(DfxCoreDumpTest, DfxCoreDumpTest006, TestSize.Level2) GTEST_LOG_(INFO) << "DfxCoreDumpTest006: end."; #endif } -} \ No newline at end of file + +/** + * @tc.name: DfxCoreDumpTest007 + * @tc.desc: test coredump when isHwasanHap_ is true + * @tc.type: FUNC + */ +HWTEST_F(DfxCoreDumpTest, DfxCoreDumpTest007, TestSize.Level2) +{ +#if defined(__aarch64__) + GTEST_LOG_(INFO) << "DfxCoreDumpTest007: start."; + CoreDumpService coreDumpService = CoreDumpService(getpid(), gettid()); + coreDumpService.isHwasanHap_ = true; + ASSERT_FALSE(coreDumpService.IsDoCoredump()); + GTEST_LOG_(INFO) << "DfxCoreDumpTest007: end."; +#endif +} +} diff --git a/tools/process_dump/coredump/dfx_coredump_service.cpp b/tools/process_dump/coredump/dfx_coredump_service.cpp index f550438ebdbe5d4cbdeee6e948661bff9a2b41bd..3ab6c6ae8c64c56fd138212eef113b4d4956d119 100644 --- a/tools/process_dump/coredump/dfx_coredump_service.cpp +++ b/tools/process_dump/coredump/dfx_coredump_service.cpp @@ -342,6 +342,15 @@ void CoreDumpService::ElfHeaderFill(Elf64_Ehdr &eh, uint16_t ePhnum) eh.e_shstrndx = ePhnum + 1; } +bool CoreDumpService::IsDoCoredump() +{ + if (VerifyTrustlist() || (IsHwasanCoredumpEnabled() && isHwasanHap_)) { + return true; + } + DFXLOGE("The bundleName %{public}s is not in whitelist or hwasan coredump disable", bundleName_.c_str()); + return false; +} + int CoreDumpService::CreateFileForCoreDump() { bundleName_ = DumpUtils::GetSelfBundleName(); @@ -349,8 +358,7 @@ int CoreDumpService::CreateFileForCoreDump() DFXLOGE("query bundleName fail"); return INVALID_FD; } - if (!VerifyTrustlist() && !IsHwasanCoredumpEnabled()) { - DFXLOGE("The bundleName %{public}s is not in whitelist or hwasan coredump disable", bundleName_.c_str()); + if (!IsDoCoredump()) { return INVALID_FD; } std::string logPath = std::string(COREDUMP_DIR_PATH) + "/" + bundleName_ + ".dmp"; @@ -399,6 +407,9 @@ uint64_t CoreDumpService::GetCoreFileSize(pid_t pid) uint16_t lineNumber = 0; DumpMemoryRegions region; while (getline(file, line)) { + if (!isHwasanHap_ && line.find("libclang_rt.hwasan.so") != std::string::npos) { + isHwasanHap_ = true; + } lineNumber += 1; ObtainDumpRegion(line, region); maps_.push_back(region); @@ -411,7 +422,7 @@ uint64_t CoreDumpService::GetCoreFileSize(pid_t pid) file.close(); coreFileSize = coreFileSize + sizeof(Elf64_Ehdr) + (lineNumber + 1) * sizeof(Elf64_Phdr) + (lineNumber + 2) * sizeof(Elf64_Shdr) + lineNumber * (sizeof(Elf64_Nhdr) + ARG100) + ARG1000; // 2 - DFXLOGI("The estimated corefile size is: %{public}ld", coreFileSize); + DFXLOGI("The estimated corefile size is: %{public}ld, is hwasan hap %{public}d", coreFileSize, isHwasanHap_); return coreFileSize; } diff --git a/tools/process_dump/coredump/dfx_coredump_service.h b/tools/process_dump/coredump/dfx_coredump_service.h index cf0262770b96e4b993f00a5c77851b531a0e3726..91c521d3f0d4ba6b5dcc0288548d327e97c6b023 100644 --- a/tools/process_dump/coredump/dfx_coredump_service.h +++ b/tools/process_dump/coredump/dfx_coredump_service.h @@ -45,6 +45,7 @@ public: std::string GetBundleNameItem(); static bool IsHwasanCoredumpEnabled(); static bool IsCoredumpSignal(const ProcessDumpRequest& request); + bool IsDoCoredump(); private: void DeInit(); void ObtainDumpRegion(std::string &line, DumpMemoryRegions ®ion); @@ -75,6 +76,7 @@ private: CoreDumpThread coreDumpThread_; ElapsedTime counter_; std::shared_ptr keyRegs_; + bool isHwasanHap_ {false}; }; } // namespace HiviewDFX } // namespace OHOS diff --git a/tools/process_dump/process_dumper.cpp b/tools/process_dump/process_dumper.cpp index 3b1b0603c96b13e6d1fbb85f47553ac18c3f124e..ed1f065e9a442338086ec7830f991a8d0be2bbf6 100644 --- a/tools/process_dump/process_dumper.cpp +++ b/tools/process_dump/process_dumper.cpp @@ -484,8 +484,9 @@ bool ProcessDumper::InitUnwinder(const ProcessDumpRequest& request, int &dumpRes return false; } #if defined(__aarch64__) - if (CoreDumpService::IsCoredumpSignal(request) || CoreDumpService::IsHwasanCoredumpEnabled()) { - if (coreDumpService_) { + if (coreDumpService_) { + if (CoreDumpService::IsCoredumpSignal(request) || + (request.siginfo.si_signo == SIGABRT && coreDumpService_->IsDoCoredump())) { coreDumpService_->StartSecondStageDump(vmPid, request); } } @@ -539,7 +540,8 @@ bool ProcessDumper::InitDfxProcess(ProcessDumpRequest& request) } DFXLOGI("Finish create all thread."); #if defined(__aarch64__) - if (CoreDumpService::IsCoredumpSignal(request) || CoreDumpService::IsHwasanCoredumpEnabled()) { + if (CoreDumpService::IsCoredumpSignal(request) || + (request.siginfo.si_signo == SIGABRT && CoreDumpService::IsHwasanCoredumpEnabled())) { coreDumpService_ = std::make_shared(request.pid, request.tid, DfxRegs::CreateFromUcontext(request.context)); if (coreDumpService_) {