diff --git a/print.cpp b/print.cpp index ad895d6..444b0c8 100644 --- a/print.cpp +++ b/print.cpp @@ -119,11 +119,30 @@ void trace(String* string) { // the names as provided by 'backtrace_symbols' are mangled for some reason. // we have to demangle them, using this weird api - // example mangled name (wrapped in double quotes): + // example mangled names (wrapped in double quotes): // "2 shard_tracy 0x00000001032d5618 _ZL17drawSettingsPanelv + 904" + // "2 shard 0x000000010ed8be34 _ZN6ShaderC2EPKcS1_P5ArrayIS1_ES1_ + 1108" + // "12 shard 0x000000010ed5edeb main + 43" + // + // the rule for finding the 'first' character is annoying, because it's usually but not always starting with an underscore, + // and when it is an underscore it's usually but not always the first underscore in the string. char buffer[1024]; - const char* mangledNameBegin = String::lastCharOccurence(traces[i], '_'); const char* mangledNameEnd = String::lastCharOccurence(traces[i], '+'); // it actually ends one char before. + const char* mangledNameBegin = null; + + if (mangledNameEnd != null && ((mangledNameEnd - traces[i]) > 2)) { + const char* cursor = mangledNameEnd - 2; + while (cursor != traces[i]) { + if (*cursor == '_') { + mangledNameBegin = cursor; + + } else if (*cursor == ' ') { + mangledNameBegin = cursor + 1; + break; + } + cursor--; + } + } if (mangledNameBegin == null || mangledNameEnd == null) { // we can't demangle this name for some reason, just copy the mangled name to the buffer @@ -132,7 +151,7 @@ void trace(String* string) { buffer[length] = '\0'; } else { - size_t length = mangledNameEnd - 1 - mangledNameBegin; + size_t length = mangledNameEnd - mangledNameBegin - 1; String::memcpy(buffer, (void*)mangledNameBegin, length); buffer[length] = '\0'; } @@ -140,9 +159,20 @@ void trace(String* string) { s32 status = -1; char* trace = abi::__cxa_demangle(buffer, null, null, &status); if (trace == null) { - println("warning: failed to demangle name: %s, exit status of attempt: %d", traces[i], status); - // just write back the original trace, un-demangled. - trace = traces[i]; + // @HACK, both 'main' and 'start' symbols will fail to be demangled, and we don't really care about printing them + // in most cases. your application (certainly true for us) will have its own endpoint which itself is of questionable + // usefulness to print, but 'main' and 'start' are even less useful. + if (String::memeq((const unsigned char*)(mangledNameBegin), (const unsigned char*)"main", sizeof("main") - 1)) { + continue; + + } else if (String::memeq((const unsigned char*)(mangledNameBegin), (const unsigned char*)"start", sizeof("start") - 1)) { + continue; + + } else { + println("warning: failed to demangle name: %s, exit status of attempt: %d", traces[i], status); + // just write back the original trace, un-demangled. + trace = traces[i]; + } } if (string == null) {