diff --git a/tools/process_dump/dfx_coredump_service.cpp b/tools/process_dump/dfx_coredump_service.cpp index f8ea8fe764e99ad515e1d4334e5c74566c5efd2e..1f0232c43e65fc8265932a84720e1f94c4a70245 100644 --- a/tools/process_dump/dfx_coredump_service.cpp +++ b/tools/process_dump/dfx_coredump_service.cpp @@ -32,6 +32,7 @@ namespace { const char *const COREDUMP_DIR_PATH = "/data/storage/el2/base/files"; const char *const COREDUMP_HAP_WHITE_LIST = "const.dfx.coredump.hap_list"; const char *const DEFAULT_BUNDLE_NAME = ""; +const char *const HWASAN_COREDUMP_ENABLE = "faultloggerd.priv.hwasan_coredump.enabled"; char g_coredumpFilePath[256] = {0}; static const int ARG16 = 16; static const int ARG100 = 100; @@ -49,6 +50,16 @@ static std::string GetCoredumpWhiteList() } } +bool CoreDumpService::IsHwasanCoredumpEnabled() +{ +#ifndef is_ohos_lite + static bool isHwasanCoredumpEnabled = OHOS::system::GetParameter(HWASAN_COREDUMP_ENABLE, "false") == "true"; + return isHwasanCoredumpEnabled; +#else + return false; +#endif +} + CoreDumpService::CoreDumpService(int32_t targetPid, int32_t targetTid) { coreDumpThread_.targetPid = targetPid; @@ -296,8 +307,8 @@ int CoreDumpService::CreateFileForCoreDump() DFXLOGE("query bundleName fail"); return INVALID_FD; } - if (!VerifyTrustlist()) { - DFXLOGE("The bundleName %{public}s is not in whitelist", bundleName_.c_str()); + if (!VerifyTrustlist() && !IsHwasanCoredumpEnabled()) { + DFXLOGE("The bundleName %{public}s is not in whitelist or hwasan coredump disable", bundleName_.c_str()); return INVALID_FD; } std::string logPath = std::string(COREDUMP_DIR_PATH) + "/" + bundleName_ + ".dmp"; diff --git a/tools/process_dump/dfx_coredump_service.h b/tools/process_dump/dfx_coredump_service.h index 453dc07373224afb9abc10e2bf2a2db855ce888f..15f1f1fb802797c685a5b7c68fffaf87119966a7 100644 --- a/tools/process_dump/dfx_coredump_service.h +++ b/tools/process_dump/dfx_coredump_service.h @@ -47,6 +47,7 @@ public: std::string GetBundleNameItem(); std::string GetBundleName(); std::shared_ptr keyRegs_; + static bool IsHwasanCoredumpEnabled(); private: enum class WriteStatus { INIT_STAGE, diff --git a/tools/process_dump/process_dumper.cpp b/tools/process_dump/process_dumper.cpp index 85a4d06c999ca20a1d208e8ab74d18441401ca6c..3c15ad1a0c40c3ec2eba84686ebd0c357029b532 100644 --- a/tools/process_dump/process_dumper.cpp +++ b/tools/process_dump/process_dumper.cpp @@ -479,7 +479,7 @@ int ProcessDumper::ParseSymbols(const ProcessDumpRequest& request, std::shared_p #if defined(__aarch64__) static void ProcessdumpDoCoredump(const ProcessDumpRequest& request, pid_t vmPid, CoreDumpService& coreDumpService) { - if (IsCoredumpSignal(request)) { + if (IsCoredumpSignal(request) || CoreDumpService::IsHwasanCoredumpEnabled()) { ElapsedTime counter; DFXLOGI("coredump begin to write segment"); int pid = request.pid; @@ -496,6 +496,9 @@ static void ProcessdumpDoCoredump(const ProcessDumpRequest& request, pid_t vmPid DFXLOGI("coredump : pid = %{public}d, elapsed time = %{public}" PRId64 "ms, ", pid, counter.Elapsed()); + if (CoreDumpService::IsHwasanCoredumpEnabled()) { + InfoCrashUnwindResult(request, true); + } _exit(0); } } @@ -569,7 +572,7 @@ bool ProcessDumper::InitDfxProcess(ProcessDumpRequest& request) } DFXLOGI("Finish create all thread."); #if defined(__aarch64__) - if (IsCoredumpSignal(request)) { + if (IsCoredumpSignal(request) || CoreDumpService::IsHwasanCoredumpEnabled()) { DFXLOGI("Begin to do Coredump."); coreDumpService_ = CoreDumpService(request.pid, request.tid); coreDumpService_.keyRegs_ = DfxRegs::CreateFromUcontext(request.context);