AK: Demangle symbols on assertion failure on Linux as well

While macOS backtrace(3) puts a space directly after the mangled symbol
name, some versions of glibc put a + directly after it. This new logic
accounts for both situations when trying to demangle.

Co-Authored-By: Andreas Kling <kling@serenityos.org>
This commit is contained in:
Andrew Kaster 2023-09-02 21:07:45 +02:00 committed by Andreas Kling
parent 4cee3b65d3
commit aa03f73c2e
Notes: sideshowbarker 2024-07-17 02:37:08 +09:00

View file

@ -38,8 +38,9 @@ ALWAYS_INLINE void dump_backtrace()
syms[i][idx.value() - 1] = '\0'; syms[i][idx.value() - 1] = '\0';
(void)fprintf(stderr, "%s ", syms[i]); (void)fprintf(stderr, "%s ", syms[i]);
auto end_of_sym = sym.find(' ', idx.value()).value_or(sym.length() - 1); auto sym_substring = sym.substring_view(idx.value());
syms[i][end_of_sym] = '\0'; auto end_of_sym = sym_substring.find_any_of("+ "sv).value_or(sym_substring.length() - 1);
syms[i][idx.value() + end_of_sym] = '\0';
size_t buf_size = 128u; size_t buf_size = 128u;
char* buf = static_cast<char*>(malloc(buf_size)); char* buf = static_cast<char*>(malloc(buf_size));
@ -49,7 +50,7 @@ ALWAYS_INLINE void dump_backtrace()
(void)fputs(buf ? buf : raw_str, stderr); (void)fputs(buf ? buf : raw_str, stderr);
free(buf); free(buf);
(void)fprintf(stderr, " %s", &syms[i][end_of_sym + 1]); (void)fprintf(stderr, " %s", &syms[i][idx.value() + end_of_sym + 1]);
} else { } else {
(void)fputs(sym.characters_without_null_termination(), stderr); (void)fputs(sym.characters_without_null_termination(), stderr);
} }