[ox/std] Make symbolicate return more flexible data
This commit is contained in:
parent
8b976279e5
commit
176ef214f2
13
deps/ox/src/ox/std/stacktrace.cpp
vendored
13
deps/ox/src/ox/std/stacktrace.cpp
vendored
@ -26,20 +26,20 @@ namespace ox {
|
|||||||
|
|
||||||
#if defined(OX_USE_STDLIB) && __has_include(<unistd.h>)
|
#if defined(OX_USE_STDLIB) && __has_include(<unistd.h>)
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static String symbolicate([[maybe_unused]]const char **frames, [[maybe_unused]]std::size_t symbolsLen, [[maybe_unused]]const char *linePrefix) {
|
static Vector<String> symbolicate([[maybe_unused]]const char **frames, [[maybe_unused]]std::size_t symbolsLen, [[maybe_unused]]const char *linePrefix) {
|
||||||
#if __has_include(<cxxabi.h>)
|
#if __has_include(<cxxabi.h>)
|
||||||
String out;
|
Vector<String> out;
|
||||||
for (auto i = 0u; i < symbolsLen; ++i) {
|
for (auto i = 0u; i < symbolsLen; ++i) {
|
||||||
Dl_info info;
|
Dl_info info;
|
||||||
if (dladdr(frames[i], &info) && info.dli_sname) {
|
if (dladdr(frames[i], &info) && info.dli_sname) {
|
||||||
int status = -1;
|
int status = -1;
|
||||||
const auto name = abi::__cxa_demangle(info.dli_sname, nullptr, 0, &status);
|
const auto name = abi::__cxa_demangle(info.dli_sname, nullptr, 0, &status);
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
out += sfmt("\t{}: {}\n", i, name);
|
out.emplace_back(sfmt("{}: {}", i, name));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out += sfmt("\t{}\n", frames[i]);
|
out.emplace_back(sfmt("{}", frames[i]));
|
||||||
}
|
}
|
||||||
return move(out);
|
return move(out);
|
||||||
#else // __has_include(<cxxabi.h>)
|
#else // __has_include(<cxxabi.h>)
|
||||||
@ -56,7 +56,10 @@ void printStackTrace([[maybe_unused]]unsigned shave) noexcept {
|
|||||||
const auto symbols = backtrace_symbols(frames.data() + shave, frames.size() - shave);
|
const auto symbols = backtrace_symbols(frames.data() + shave, frames.size() - shave);
|
||||||
const auto symbolicatedStacktrace = symbolicate(bit_cast<const char**>(frames.data() + shave), frames.size() - shave, "\t");
|
const auto symbolicatedStacktrace = symbolicate(bit_cast<const char**>(frames.data() + shave), frames.size() - shave, "\t");
|
||||||
free(symbols);
|
free(symbols);
|
||||||
oxErrf("Stacktrace:\n{}", symbolicatedStacktrace);
|
oxErr("Stacktrace:\n");
|
||||||
|
for (const auto &s : symbolicatedStacktrace) {
|
||||||
|
oxErrf("\t{}\n", s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user