| 2664 | } |
| 2665 | |
| 2666 | void StackTrace::generateNew(void) { |
| 2667 | #if ELPP_STACKTRACE |
| 2668 | m_stack.clear(); |
| 2669 | void* stack[kMaxStack]; |
| 2670 | unsigned int size = backtrace(stack, kMaxStack); |
| 2671 | char** strings = backtrace_symbols(stack, size); |
| 2672 | if (size > kStackStart) { // Skip StackTrace c'tor and generateNew |
| 2673 | for (std::size_t i = kStackStart; i < size; ++i) { |
| 2674 | char* mangName = nullptr; |
| 2675 | char* hex = nullptr; |
| 2676 | char* addr = nullptr; |
| 2677 | for (char* c = strings[i]; *c; ++c) { |
| 2678 | switch (*c) { |
| 2679 | case '(': |
| 2680 | mangName = c; |
| 2681 | break; |
| 2682 | case '+': |
| 2683 | hex = c; |
| 2684 | break; |
| 2685 | case ')': |
| 2686 | addr = c; |
| 2687 | break; |
| 2688 | default: |
| 2689 | break; |
| 2690 | } |
| 2691 | } |
| 2692 | // Perform demangling if parsed properly |
| 2693 | if (mangName != nullptr && hex != nullptr && addr != nullptr && mangName < hex) { |
| 2694 | *mangName++ = '\0'; |
| 2695 | *hex++ = '\0'; |
| 2696 | *addr++ = '\0'; |
| 2697 | int status = 0; |
| 2698 | char* demangName = abi::__cxa_demangle(mangName, 0, 0, &status); |
| 2699 | // if demangling is successful, output the demangled function name |
| 2700 | if (status == 0) { |
| 2701 | // Success (see http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.3/a01696.html) |
| 2702 | StackTraceEntry entry(i - 1, strings[i], demangName, hex, addr); |
| 2703 | m_stack.push_back(entry); |
| 2704 | } else { |
| 2705 | // Not successful - we will use mangled name |
| 2706 | StackTraceEntry entry(i - 1, strings[i], mangName, hex, addr); |
| 2707 | m_stack.push_back(entry); |
| 2708 | } |
| 2709 | free(demangName); |
| 2710 | } else { |
| 2711 | StackTraceEntry entry(i - 1, strings[i]); |
| 2712 | m_stack.push_back(entry); |
| 2713 | } |
| 2714 | } |
| 2715 | } |
| 2716 | free(strings); |
| 2717 | #else |
| 2718 | ELPP_INTERNAL_INFO(1, "Stacktrace generation not supported for selected compiler"); |
| 2719 | #endif // ELPP_STACKTRACE |
| 2720 | } |
| 2721 | |
| 2722 | // Static helper functions |
| 2723 | |