From 6f67b1c61a731fa023b393f6cfd2f859897ab6c7 Mon Sep 17 00:00:00 2001 From: Maosu Zhao Date: Wed, 25 Sep 2024 14:33:43 +0800 Subject: [PATCH 1/2] [DeviceSanitizer] Only try to get backtrace symbols when needed --- source/loader/layers/sanitizer/common.hpp | 1 + .../layers/sanitizer/linux/backtrace.cpp | 20 +++++++++---------- source/loader/layers/sanitizer/stacktrace.cpp | 8 +++++++- source/loader/layers/sanitizer/stacktrace.hpp | 6 ++++-- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/source/loader/layers/sanitizer/common.hpp b/source/loader/layers/sanitizer/common.hpp index 2b6a7c22c3..90402b9429 100644 --- a/source/loader/layers/sanitizer/common.hpp +++ b/source/loader/layers/sanitizer/common.hpp @@ -127,6 +127,7 @@ inline uint64_t GetSizeAndRedzoneSizeForLocal(uint64_t Size, return Result; \ } +using BacktraceFrame = void *; using BacktraceInfo = std::string; struct SourceInfo { diff --git a/source/loader/layers/sanitizer/linux/backtrace.cpp b/source/loader/layers/sanitizer/linux/backtrace.cpp index b336dc3675..5975515678 100644 --- a/source/loader/layers/sanitizer/linux/backtrace.cpp +++ b/source/loader/layers/sanitizer/linux/backtrace.cpp @@ -17,20 +17,20 @@ namespace ur_sanitizer_layer { StackTrace GetCurrentBacktrace() { void *Frames[MAX_BACKTRACE_FRAMES]; int FrameCount = backtrace(Frames, MAX_BACKTRACE_FRAMES); - char **Symbols = backtrace_symbols(Frames, FrameCount); - - if (Symbols == nullptr) { - return StackTrace(); - } StackTrace Stack; - for (int i = 0; i < FrameCount; i++) { - BacktraceInfo addr_info(Symbols[i]); - Stack.stack.emplace_back(addr_info); - } - free(Symbols); + Stack.stack = + std::vector(&Frames[0], &Frames[FrameCount - 1]); return Stack; } +char **GetBacktraceSymbols(const std::vector &BacktraceFrames) { + assert(!BacktraceFrames.empty()); + + char **BacktraceSymbols = + backtrace_symbols(&BacktraceFrames[0], BacktraceFrames.size()); + return BacktraceSymbols; +} + } // namespace ur_sanitizer_layer diff --git a/source/loader/layers/sanitizer/stacktrace.cpp b/source/loader/layers/sanitizer/stacktrace.cpp index 38bef94811..8adaa2cd34 100644 --- a/source/loader/layers/sanitizer/stacktrace.cpp +++ b/source/loader/layers/sanitizer/stacktrace.cpp @@ -86,7 +86,11 @@ void StackTrace::print() const { unsigned index = 0; - for (auto &BI : stack) { + char **BacktraceSymbols = GetBacktraceSymbols(stack); + + for (size_t i = 0; i < stack.size(); i++) { + BacktraceInfo BI = BacktraceSymbols[i]; + // Skip runtime modules if (Contains(BI, "libsycl.so") || Contains(BI, "libpi_unified_runtime.so") || @@ -123,6 +127,8 @@ void StackTrace::print() const { ++index; } getContext()->logger.always(""); + + free(BacktraceSymbols); } } // namespace ur_sanitizer_layer diff --git a/source/loader/layers/sanitizer/stacktrace.hpp b/source/loader/layers/sanitizer/stacktrace.hpp index 31b661cc7d..a98c310473 100644 --- a/source/loader/layers/sanitizer/stacktrace.hpp +++ b/source/loader/layers/sanitizer/stacktrace.hpp @@ -18,14 +18,16 @@ namespace ur_sanitizer_layer { -constexpr size_t MAX_BACKTRACE_FRAMES = 64; +constexpr size_t MAX_BACKTRACE_FRAMES = 48; struct StackTrace { - std::vector stack; + std::vector stack; void print() const; }; StackTrace GetCurrentBacktrace(); +char **GetBacktraceSymbols(const std::vector &BacktraceFrames); + } // namespace ur_sanitizer_layer From e36e1b6e4e5be4248c78129980645a3ec00965c1 Mon Sep 17 00:00:00 2001 From: Maosu Zhao Date: Wed, 25 Sep 2024 15:23:24 +0800 Subject: [PATCH 2/2] update as per comments --- source/loader/layers/sanitizer/linux/backtrace.cpp | 2 +- source/loader/layers/sanitizer/stacktrace.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/loader/layers/sanitizer/linux/backtrace.cpp b/source/loader/layers/sanitizer/linux/backtrace.cpp index 5975515678..b746348205 100644 --- a/source/loader/layers/sanitizer/linux/backtrace.cpp +++ b/source/loader/layers/sanitizer/linux/backtrace.cpp @@ -15,7 +15,7 @@ namespace ur_sanitizer_layer { StackTrace GetCurrentBacktrace() { - void *Frames[MAX_BACKTRACE_FRAMES]; + BacktraceFrame Frames[MAX_BACKTRACE_FRAMES]; int FrameCount = backtrace(Frames, MAX_BACKTRACE_FRAMES); StackTrace Stack; diff --git a/source/loader/layers/sanitizer/stacktrace.hpp b/source/loader/layers/sanitizer/stacktrace.hpp index a98c310473..57811bba01 100644 --- a/source/loader/layers/sanitizer/stacktrace.hpp +++ b/source/loader/layers/sanitizer/stacktrace.hpp @@ -18,7 +18,7 @@ namespace ur_sanitizer_layer { -constexpr size_t MAX_BACKTRACE_FRAMES = 48; +constexpr size_t MAX_BACKTRACE_FRAMES = 64; struct StackTrace { std::vector stack;