Skip to content

Commit 5e95d33

Browse files
authored
[DeviceSanitizer] Only try to get backtrace symbols when needed (#2128)
1 parent 0afc3e3 commit 5e95d33

File tree

4 files changed

+22
-13
lines changed

4 files changed

+22
-13
lines changed

source/loader/layers/sanitizer/common.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ inline uint64_t GetSizeAndRedzoneSizeForLocal(uint64_t Size,
127127
return Result; \
128128
}
129129

130+
using BacktraceFrame = void *;
130131
using BacktraceInfo = std::string;
131132

132133
struct SourceInfo {

source/loader/layers/sanitizer/linux/backtrace.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,22 @@
1515
namespace ur_sanitizer_layer {
1616

1717
StackTrace GetCurrentBacktrace() {
18-
void *Frames[MAX_BACKTRACE_FRAMES];
18+
BacktraceFrame Frames[MAX_BACKTRACE_FRAMES];
1919
int FrameCount = backtrace(Frames, MAX_BACKTRACE_FRAMES);
20-
char **Symbols = backtrace_symbols(Frames, FrameCount);
21-
22-
if (Symbols == nullptr) {
23-
return StackTrace();
24-
}
2520

2621
StackTrace Stack;
27-
for (int i = 0; i < FrameCount; i++) {
28-
BacktraceInfo addr_info(Symbols[i]);
29-
Stack.stack.emplace_back(addr_info);
30-
}
31-
free(Symbols);
22+
Stack.stack =
23+
std::vector<BacktraceFrame>(&Frames[0], &Frames[FrameCount - 1]);
3224

3325
return Stack;
3426
}
3527

28+
char **GetBacktraceSymbols(const std::vector<BacktraceFrame> &BacktraceFrames) {
29+
assert(!BacktraceFrames.empty());
30+
31+
char **BacktraceSymbols =
32+
backtrace_symbols(&BacktraceFrames[0], BacktraceFrames.size());
33+
return BacktraceSymbols;
34+
}
35+
3636
} // namespace ur_sanitizer_layer

source/loader/layers/sanitizer/stacktrace.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,11 @@ void StackTrace::print() const {
8686

8787
unsigned index = 0;
8888

89-
for (auto &BI : stack) {
89+
char **BacktraceSymbols = GetBacktraceSymbols(stack);
90+
91+
for (size_t i = 0; i < stack.size(); i++) {
92+
BacktraceInfo BI = BacktraceSymbols[i];
93+
9094
// Skip runtime modules
9195
if (Contains(BI, "libsycl.so") ||
9296
Contains(BI, "libpi_unified_runtime.so") ||
@@ -123,6 +127,8 @@ void StackTrace::print() const {
123127
++index;
124128
}
125129
getContext()->logger.always("");
130+
131+
free(BacktraceSymbols);
126132
}
127133

128134
} // namespace ur_sanitizer_layer

source/loader/layers/sanitizer/stacktrace.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ namespace ur_sanitizer_layer {
2121
constexpr size_t MAX_BACKTRACE_FRAMES = 64;
2222

2323
struct StackTrace {
24-
std::vector<BacktraceInfo> stack;
24+
std::vector<BacktraceFrame> stack;
2525

2626
void print() const;
2727
};
2828

2929
StackTrace GetCurrentBacktrace();
3030

31+
char **GetBacktraceSymbols(const std::vector<BacktraceFrame> &BacktraceFrames);
32+
3133
} // namespace ur_sanitizer_layer

0 commit comments

Comments
 (0)