diff --git a/unified-runtime/source/loader/layers/sanitizer/sanitizer_common/linux/backtrace.cpp b/unified-runtime/source/loader/layers/sanitizer/sanitizer_common/linux/backtrace.cpp index 348e837a3142d..7e2203c5850bb 100644 --- a/unified-runtime/source/loader/layers/sanitizer/sanitizer_common/linux/backtrace.cpp +++ b/unified-runtime/source/loader/layers/sanitizer/sanitizer_common/linux/backtrace.cpp @@ -13,6 +13,7 @@ #include "sanitizer_common/sanitizer_stacktrace.hpp" #include +#include #include namespace ur_sanitizer_layer { @@ -21,9 +22,15 @@ StackTrace GetCurrentBacktrace() { BacktraceFrame Frames[MAX_BACKTRACE_FRAMES]; int FrameCount = backtrace(Frames, MAX_BACKTRACE_FRAMES); + // The Frames contain the return addresses, which is one instruction after the + // call instruction. Adjust the addresses so that symbolizer would give more + // precise result. + for (int I = 0; I < FrameCount; I++) { + Frames[I] = (void *)((uintptr_t)Frames[I] - 1); + } + StackTrace Stack; - Stack.stack = - std::vector(&Frames[0], &Frames[FrameCount - 1]); + Stack.stack = std::vector(&Frames[0], &Frames[FrameCount]); return Stack; }