70 #include <android/log.h>
71 #elif defined(USING_UNWIND_LIB)
72 #define UNW_LOCAL_ONLY
73 #include <libunwind.h>
79 #define UNW_PRINTF_POINTER "0x%x: "
80 #define UNW_PRINTF_NAME_AND_POINTER " (%s+0x%x)"
83 #if UINTPTR_MAX == 0xffffffff
85 #define UNW_PRINTF_POINTER "0x%x: "
86 #define UNW_PRINTF_NAME_AND_POINTER " (%s+0x%x)"
87 #elif UINTPTR_MAX == 0xffffffffffffffff
89 #define UNW_PRINTF_POINTER "0x%lx: "
90 #define UNW_PRINTF_NAME_AND_POINTER " (%s+0x%lx)"
107 __android_log_print(ANDROID_LOG_WARN,
"stackwalker",
"stack trace is not available");
108 #elif defined(USING_UNWIND_LIB)
109 unw_context_t context;
110 unw_getcontext(&context);
113 unw_init_local(&cursor, &context);
115 while (unw_step(&cursor) > 0)
117 unw_word_t instructionPointer;
118 unw_get_reg(&cursor, UNW_REG_IP, &instructionPointer);
120 if (instructionPointer == 0)
123 static const int logLineSize = 256;
124 char logLine[logLineSize];
125 int offset = std::snprintf(logLine, logLineSize, UNW_PRINTF_POINTER, instructionPointer);
127 char symbol[logLineSize - 20];
128 unw_word_t symbolOffset;
129 if (unw_get_proc_name(&cursor, symbol,
sizeof(symbol), &symbolOffset) == 0)
132 char* demangled = abi::__cxa_demangle(symbol,
nullptr,
nullptr, &status);
134 char* symbolName = symbol;
136 symbolName = demangled;
138 std::snprintf(&logLine[offset], logLineSize - offset, UNW_PRINTF_NAME_AND_POINTER, symbolName, symbolOffset);
139 std::free(demangled);
142 std::snprintf(&logLine[offset], logLineSize - offset,
" (unable to retrieve symbol name)");
147 OnOutput(
"Stack trace is not available");