浏览代码

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>
Andrew Kaster 1 年之前
父节点
当前提交
aa03f73c2e
共有 1 个文件被更改,包括 4 次插入3 次删除
  1. 4 3
      AK/Assertions.cpp

+ 4 - 3
AK/Assertions.cpp

@@ -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);
-            syms[i][end_of_sym] = '\0';
+            auto sym_substring = sym.substring_view(idx.value());
+            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);
         }
         }