81 constexpr int max_frames = 64;
82 void* buffer[max_frames];
84 int frame_count = backtrace(buffer, max_frames);
86 std::cerr <<
"\n=== Stack Trace ===\n";
87 backtrace_symbols_fd(buffer, frame_count, STDERR_FILENO);
88 std::cerr <<
"===================\n\n";
90#elif HHC_HAVE_STACKWALK
92 constexpr int max_frames = 64;
93 void* stack[max_frames];
95 HANDLE process = GetCurrentProcess();
96 SymInitialize(process, NULL, TRUE);
98 WORD frame_count = CaptureStackBackTrace(0, max_frames, stack, NULL);
100 std::cerr <<
"\n=== Stack Trace ===\n";
102 SYMBOL_INFO* symbol = (SYMBOL_INFO*)calloc(
sizeof(SYMBOL_INFO) + 256 *
sizeof(char), 1);
104 symbol->MaxNameLen = 255;
105 symbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
107 for (
int i = 0; i < frame_count; i++) {
108 if (SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol)) {
109 std::cerr <<
" " << symbol->Name <<
" [0x" << std::hex << symbol->Address << std::dec <<
"]\n";
111 std::cerr <<
" [0x" << std::hex << (DWORD64)stack[i] << std::dec <<
"]\n";
118 std::cerr <<
"===================\n\n";
123 std::cerr <<
"\n[Stack trace not available on this platform]\n\n";