MCPcopy Create free account
hub / github.com/VCVRack/Rack / getStackTrace

Function getStackTrace

src/system.cpp:668–725  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

666
667
668std::string getStackTrace() {
669 void* stack[128];
670 int stackLen = LENGTHOF(stack);
671 std::string s;
672
673#if defined ARCH_LIN || defined ARCH_MAC
674 stackLen = backtrace(stack, stackLen);
675
676 // Skip the first line because it's this function.
677 for (int i = 1; i < stackLen; i++) {
678 // Get symbol info from stack address
679 Dl_info info = {};
680 if (dladdr(stack[i], &info)) {
681 // Ignore error
682 }
683
684 // Binary/library filename
685 s += info.dli_fname ? info.dli_fname : "??";
686 s += ": ";
687
688 // Attempt to demangle C++ symbol name
689 if (info.dli_sname) {
690 char* demangled = abi::__cxa_demangle(info.dli_sname, NULL, NULL, NULL);
691 if (demangled) {
692 s += demangled;
693 free(demangled);
694 }
695 else {
696 s += info.dli_sname;
697 }
698 }
699 else {
700 s += "??";
701 }
702
703 s += " +";
704 ptrdiff_t offset = (char*) stack[i] - (char*) info.dli_saddr;
705 s += string::f("0x%x", offset);
706 s += "\n";
707 }
708#elif defined ARCH_WIN
709 HANDLE process = GetCurrentProcess();
710 SymInitialize(process, NULL, true);
711 stackLen = CaptureStackBackTrace(0, stackLen, stack, NULL);
712
713 SYMBOL_INFO* symbol = (SYMBOL_INFO*) calloc(sizeof(SYMBOL_INFO) + 256, 1);
714 symbol->MaxNameLen = 255;
715 symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
716
717 for (int i = 1; i < stackLen; i++) {
718 SymFromAddr(process, (DWORD64) stack[i], 0, symbol);
719 s += string::f("%d: %s 0x%" PRIx64 "\n", stackLen - i - 1, symbol->Name, symbol->Address);
720 }
721 free(symbol);
722#endif
723
724 return s;
725}

Callers 1

fatalSignalHandlerFunction · 0.85

Calls 1

fFunction · 0.70

Tested by

no test coverage detected