From c5f73c629e7a9743707dec88c9e38375b1d0e52a Mon Sep 17 00:00:00 2001 From: xlgitee Date: Sat, 21 Jun 2025 10:24:21 +0800 Subject: [PATCH] =?UTF-8?q?hwasan=E5=9C=BA=E6=99=AF=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8abort=5Fon=5Ferror,=E8=A7=A6=E5=8F=91=E7=94=9F?= =?UTF-8?q?=E6=88=90coredump?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xlgitee Change-Id: I9eafc49652529d0b9b57cfaa0624c5334f94c517 --- tools/process_dump/dfx_coredump_service.cpp | 15 +++++++++++++-- tools/process_dump/dfx_coredump_service.h | 1 + tools/process_dump/process_dumper.cpp | 7 +++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/tools/process_dump/dfx_coredump_service.cpp b/tools/process_dump/dfx_coredump_service.cpp index f8ea8fe76..1f0232c43 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 453dc0737..15f1f1fb8 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 85a4d06c9..3c15ad1a0 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); -- Gitee