|
4 | 4 |
|
5 | 5 | #include "wpi/StackTrace.h"
|
6 | 6 |
|
| 7 | +#ifdef __cpp_lib_stacktrace |
| 8 | +#include <stacktrace> |
| 9 | +#elif !defined(_WIN32) |
7 | 10 | #include <execinfo.h>
|
| 11 | +#endif |
8 | 12 |
|
9 | 13 | #include <string>
|
10 | 14 |
|
|
16 | 20 | namespace wpi {
|
17 | 21 |
|
18 | 22 | std::string GetStackTraceDefault(int offset) {
|
| 23 | + wpi::SmallString<1024> buf; |
| 24 | + wpi::raw_svector_ostream trace(buf); |
| 25 | + |
| 26 | +#ifdef __cpp_lib_stacktrace |
| 27 | + auto stackTrace = std::stacktrace::current(); |
| 28 | + |
| 29 | + for (size_t i = offset; i < stackTrace.size(); ++i) { |
| 30 | + // Only print recursive functions once in a row |
| 31 | + if (i == 0 || stackTrace[i] != stackTrace[i - 1]) { |
| 32 | + trace << "\tat " << std::to_string(stackTrace[i]) << '\n'; |
| 33 | + } |
| 34 | + } |
| 35 | +#elif !defined(_WIN32) |
19 | 36 | void* stackTrace[128];
|
20 | 37 | int stackSize = backtrace(stackTrace, 128);
|
21 | 38 | char** mangledSymbols = backtrace_symbols(stackTrace, stackSize);
|
22 |
| - wpi::SmallString<1024> buf; |
23 |
| - wpi::raw_svector_ostream trace(buf); |
24 | 39 |
|
25 |
| - for (int i = offset; i < stackSize; i++) { |
26 |
| - // Only print recursive functions once in a row. |
| 40 | + for (int i = offset; i < stackSize; ++i) { |
| 41 | + // Only print recursive functions once in a row |
27 | 42 | if (i == 0 || stackTrace[i] != stackTrace[i - 1]) {
|
28 |
| - // extract just function name from "pathToExe(functionName+offset)" |
| 43 | + // Extract just function name from "pathToExe(functionName+offset)" |
29 | 44 | std::string_view sym = split(mangledSymbols[i], '(').second;
|
30 | 45 | std::string_view offset;
|
31 | 46 | std::tie(sym, offset) = split(sym, '+');
|
32 | 47 | std::string_view addr;
|
33 | 48 | std::tie(offset, addr) = split(offset, ')');
|
34 |
| - trace << "\tat " << Demangle(sym) << " + " << offset << addr << "\n"; |
| 49 | + |
| 50 | + trace << "\tat " << Demangle(sym) << " + " << offset << addr << '\n'; |
35 | 51 | }
|
36 | 52 | }
|
37 | 53 |
|
38 | 54 | std::free(mangledSymbols);
|
| 55 | +#endif |
39 | 56 |
|
40 | 57 | return std::string{trace.str()};
|
41 | 58 | }
|
|
0 commit comments