From 983da1446fad564c115994f903c1c675f5d718c8 Mon Sep 17 00:00:00 2001 From: cs1111 Date: Thu, 7 Aug 2025 16:12:32 +0800 Subject: [PATCH] fix:addr_sanitizer Signed-off-by: cs1111 Change-Id: I854316e1caa33ff198d301b01dc559ddf61b429f --- interfaces/common/dfx_frame.h | 34 ++++++++++++++++++- .../src/utils/dfx_frame_formatter.cpp | 5 ++- interfaces/innerkits/unwinder/unwinder.cpp | 6 +++- services/BUILD.gn | 3 ++ services/main.cpp | 2 +- tools/process_dump/BUILD.gn | 3 ++ .../process_dump/dump_info_json_formatter.cpp | 7 ++-- tools/process_dump/main.cpp | 2 +- 8 files changed, 51 insertions(+), 11 deletions(-) diff --git a/interfaces/common/dfx_frame.h b/interfaces/common/dfx_frame.h index 1f76182f3..b4065ae79 100644 --- a/interfaces/common/dfx_frame.h +++ b/interfaces/common/dfx_frame.h @@ -15,6 +15,7 @@ #ifndef DFX_FRAME_H #define DFX_FRAME_H +#include #include #include #include @@ -23,7 +24,36 @@ namespace OHOS { namespace HiviewDFX { class DfxMap; - +struct ParseSymbolState { + ParseSymbolState() = default; + ParseSymbolState(const ParseSymbolState &parseSymbolState) + { + if (parseSymbolState.isParseSymbolComplete) { + isParseSymbolComplete.store(true); + } else { + isParseSymbolComplete.store(false); + } + } + ParseSymbolState& operator=(const ParseSymbolState& parseSymbolState) + { + if (parseSymbolState.isParseSymbolComplete) { + isParseSymbolComplete.store(true); + } else { + isParseSymbolComplete.store(false); + } + return *this; + } + bool IsParseSymbolComplete() const + { + return isParseSymbolComplete.load(); + } + void SetParseSymbolState(bool state) + { + isParseSymbolComplete.store(state); + } +private: + std::atomic isParseSymbolComplete {false}; +}; /** * @brief Native Frame struct * It serves as the public definition of the native stack frame. @@ -61,6 +91,8 @@ struct DfxFrame { int32_t column {0}; /** Js frame package name */ std::string packageName; + /** state of parse symbol */ + ParseSymbolState parseSymbolState; DfxFrame() {} DfxFrame(uint64_t pc, uint64_t sp = 0) : pc(pc), sp(sp) {} diff --git a/interfaces/innerkits/unwinder/src/utils/dfx_frame_formatter.cpp b/interfaces/innerkits/unwinder/src/utils/dfx_frame_formatter.cpp index 367e9e1d9..1fdc4ee99 100644 --- a/interfaces/innerkits/unwinder/src/utils/dfx_frame_formatter.cpp +++ b/interfaces/innerkits/unwinder/src/utils/dfx_frame_formatter.cpp @@ -62,9 +62,8 @@ std::string DfxFrameFormatter::GetFrameStr(const DfxFrame& frame) } else { data += " [Unknown]"; } - if (frame.funcName.length() > MAX_FUNC_NAME_LEN) { - DFXLOGD("length of funcName greater than 256 byte, do not display it"); - } else if (!frame.funcName.empty()) { + if (frame.parseSymbolState.IsParseSymbolComplete() && !frame.funcName.empty() && + frame.funcName.length() <= MAX_FUNC_NAME_LEN) { data += "(" + frame.funcName; data += StringPrintf("+%" PRId64, frame.funcOffset); data += ")"; diff --git a/interfaces/innerkits/unwinder/unwinder.cpp b/interfaces/innerkits/unwinder/unwinder.cpp index 85bb83de0..b603d2137 100644 --- a/interfaces/innerkits/unwinder/unwinder.cpp +++ b/interfaces/innerkits/unwinder/unwinder.cpp @@ -1273,7 +1273,7 @@ void Unwinder::Impl::ParseFrameSymbol(DfxFrame& frame) DFXLOGU("Failed to get symbol, relPc: %{public}" PRIx64 ", mapName: %{public}s", frame.relPc, frame.mapName.c_str()); } - frame.buildId = elf->GetBuildId(); + frame.parseSymbolState.SetParseSymbolState(true); } void Unwinder::Impl::FillFrame(DfxFrame& frame, bool needSymParse) @@ -1288,6 +1288,10 @@ void Unwinder::Impl::FillFrame(DfxFrame& frame, bool needSymParse) DFX_TRACE_SCOPED_DLSYM("FillFrame:%s", frame.mapName.c_str()); frame.relPc = frame.map->GetRelPc(frame.pc); frame.mapOffset = frame.map->offset; + if (frame.map->GetElf() == nullptr) { + return; + } + frame.buildId = frame.map->GetElf()->GetBuildId(); DFXLOGU("mapName: %{public}s, mapOffset: %{public}" PRIx64 "", frame.mapName.c_str(), frame.mapOffset); if (needSymParse) { ParseFrameSymbol(frame); diff --git a/services/BUILD.gn b/services/BUILD.gn index 1c0c28b40..aa5b93dab 100644 --- a/services/BUILD.gn +++ b/services/BUILD.gn @@ -156,6 +156,7 @@ if (defined(ohos_lite)) { "DFX_LOG_HILOG_BASE", "DFX_ENABLE_TRACE", ] + deps = [ ":faultlogger.conf", @@ -172,6 +173,8 @@ if (defined(ohos_lite)) { if (!is_asan) { deps += [ ":faultloggerd.cfg" ] + } else { + defines += [ "DFX_ALLOCATE_ASAN" ] } external_deps = [ diff --git a/services/main.cpp b/services/main.cpp index 5a0c82edc..485b4e20c 100644 --- a/services/main.cpp +++ b/services/main.cpp @@ -36,7 +36,7 @@ static int DoGetCrashFd(const struct ProcessDumpRequest* request) int main(int argc, char *argv[]) { -#if defined(DEBUG_CRASH_LOCAL_HANDLER) +#if defined(DEBUG_CRASH_LOCAL_HANDLER) && !defined(DFX_ALLOCATE_ASAN) DFX_GetCrashFdFunc(DoGetCrashFd); DFX_InstallLocalSignalHandler(); #endif diff --git a/tools/process_dump/BUILD.gn b/tools/process_dump/BUILD.gn index 862c4636c..5a53f81df 100644 --- a/tools/process_dump/BUILD.gn +++ b/tools/process_dump/BUILD.gn @@ -194,6 +194,9 @@ if (defined(ohos_lite)) { "DFX_LOG_HILOG_BASE", "DFX_ENABLE_TRACE", ] + if (is_asan) { + defines += [ "DFX_ALLOCATE_ASAN" ] + } if (faultloggerd_liteperf_enable) { defines += [ "DFX_ENABLE_LPERF" ] } diff --git a/tools/process_dump/dump_info_json_formatter.cpp b/tools/process_dump/dump_info_json_formatter.cpp index 25c8e13e2..cdc130ac7 100644 --- a/tools/process_dump/dump_info_json_formatter.cpp +++ b/tools/process_dump/dump_info_json_formatter.cpp @@ -168,11 +168,10 @@ void DumpInfoJsonFormatter::FillNativeFrameJson(const DfxFrame& frame, Json::Val #else frameJson["pc"] = StringPrintf("%08llx", frame.relPc); #endif - if (frame.funcName.length() > MAX_FUNC_NAME_LEN) { - DFXLOGD("length of funcName greater than 256 byte, do not report it"); - frameJson["symbol"] = ""; - } else { + if (frame.parseSymbolState.IsParseSymbolComplete() && frame.funcName.length() <= MAX_FUNC_NAME_LEN) { frameJson["symbol"] = frame.funcName; + } else { + frameJson["symbol"] = ""; } frameJson["offset"] = frame.funcOffset; std::string strippedMapName = DfxMap::UnFormatMapName(frame.mapName); diff --git a/tools/process_dump/main.cpp b/tools/process_dump/main.cpp index 83f58178f..29be364ae 100644 --- a/tools/process_dump/main.cpp +++ b/tools/process_dump/main.cpp @@ -57,7 +57,7 @@ static bool ParseParameters(int argc, char *argv[], bool &isSignalHdlr, bool &is int main(int argc, char *argv[]) { DFXLOGI("Start main function of processdump"); -#if defined(DEBUG_CRASH_LOCAL_HANDLER) +#if defined(DEBUG_CRASH_LOCAL_HANDLER) && !defined(DFX_ALLOCATE_ASAN) DFX_InstallLocalSignalHandler(); #endif if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) { -- Gitee