xref: /dpdk/lib/eal/windows/eal_debug.c (revision ae67895b507bb6af22263c79ba0d5c374b396485)
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
rte_dump_stack(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