+ PVOID stack_trace[BACKTRACE_SIZE] = {0};
+ USHORT frame_num;
+ BOOL ret;
+ HANDLE process = GetCurrentProcess();
+
+ ret = SymInitialize(process, NULL, TRUE);
+ if (!ret) {
+ RTE_LOG_WIN32_ERR("SymInitialize()");
+ return;
+ }
+
+ SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_UNDNAME);
+
+ frame_num = RtlCaptureStackBackTrace(0, BACKTRACE_SIZE,
+ stack_trace, NULL);
+
+ while (frame_num > 0) {
+ DWORD64 address = (DWORD64)(stack_trace[frame_num - 1]);
+ DWORD64 sym_disp = 0;
+ DWORD error_code = 0, lin_disp;
+ char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)];
+ PSYMBOL_INFO symbol_info = (PSYMBOL_INFO)buffer;
+ IMAGEHLP_LINE64 line;
+
+ symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO);
+ symbol_info->MaxNameLen = MAX_SYM_NAME;
+ line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
+
+ ret = SymFromAddr(process, address, &sym_disp, symbol_info);
+ if (!ret) {
+ error_code = GetLastError();
+ if (error_code == ERROR_INVALID_ADDRESS) {
+ /* Missing symbols, print message */
+ rte_log(RTE_LOG_ERR, RTE_LOGTYPE_EAL,
+ "%d: [<missing_symbols>]\n", frame_num--);
+ continue;
+ } else {
+ RTE_LOG_WIN32_ERR("SymFromAddr()");
+ goto end;
+ }
+ }
+
+ ret = SymGetLineFromAddr64(process, address, &lin_disp, &line);
+ if (!ret) {
+ error_code = GetLastError();
+ /* If ERROR_INVALID_ADDRESS tag unknown and proceed */
+ if (error_code != ERROR_INVALID_ADDRESS) {
+ RTE_LOG_WIN32_ERR("SymGetLineFromAddr64()");
+ goto end;
+ }
+ }