1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2019 Intel Corporation 3 */ 4 5 #include <stdarg.h> 6 #include <rte_log.h> 7 #include <rte_debug.h> 8 #include <rte_windows.h> 9 10 #include "eal_private.h" 11 12 #include <dbghelp.h> 13 14 #define BACKTRACE_SIZE 256 15 16 /* dump the stack of the calling core */ 17 void 18 rte_dump_stack(void) 19 { 20 PVOID stack_trace[BACKTRACE_SIZE] = {0}; 21 USHORT frame_num; 22 BOOL ret; 23 HANDLE process = GetCurrentProcess(); 24 25 ret = SymInitialize(process, NULL, TRUE); 26 if (!ret) { 27 RTE_LOG_WIN32_ERR("SymInitialize()"); 28 return; 29 } 30 31 SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_UNDNAME); 32 33 frame_num = RtlCaptureStackBackTrace(0, BACKTRACE_SIZE, 34 stack_trace, NULL); 35 36 while (frame_num > 0) { 37 DWORD64 address = (DWORD64)(stack_trace[frame_num - 1]); 38 DWORD64 sym_disp = 0; 39 DWORD error_code = 0, lin_disp; 40 char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)]; 41 PSYMBOL_INFO symbol_info = (PSYMBOL_INFO)buffer; 42 IMAGEHLP_LINE64 line; 43 44 symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO); 45 symbol_info->MaxNameLen = MAX_SYM_NAME; 46 line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); 47 48 ret = SymFromAddr(process, address, &sym_disp, symbol_info); 49 if (!ret) { 50 error_code = GetLastError(); 51 if (error_code == ERROR_INVALID_ADDRESS) { 52 /* Missing symbols, print message */ 53 EAL_LOG(ERR, 54 "%d: [<missing_symbols>]", frame_num--); 55 continue; 56 } else { 57 RTE_LOG_WIN32_ERR("SymFromAddr()"); 58 goto end; 59 } 60 } 61 62 ret = SymGetLineFromAddr64(process, address, &lin_disp, &line); 63 if (!ret) { 64 error_code = GetLastError(); 65 /* If ERROR_INVALID_ADDRESS tag unknown and proceed */ 66 if (error_code != ERROR_INVALID_ADDRESS) { 67 RTE_LOG_WIN32_ERR("SymGetLineFromAddr64()"); 68 goto end; 69 } 70 } 71 72 EAL_LOG(ERR, 73 "%d: [%s (%s+0x%0llx)[0x%0llX]]", frame_num, 74 error_code ? "<unknown>" : line.FileName, 75 symbol_info->Name, sym_disp, symbol_info->Address); 76 frame_num--; 77 } 78 end: 79 ret = SymCleanup(process); 80 if (!ret) 81 RTE_LOG_WIN32_ERR("SymCleanup()"); 82 } 83