From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3F1F3A0350; Tue, 23 Jun 2020 22:58:02 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 737561D6D1; Tue, 23 Jun 2020 22:58:00 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id AC8291D6D4 for ; Tue, 23 Jun 2020 22:57:58 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from talshn@mellanox.com) with SMTP; 23 Jun 2020 23:57:55 +0300 Received: from l-wincomp04-vm.labs.mlnx (l-wincomp04-vm.mtl.labs.mlnx [10.237.1.5]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 05NKvs7c009012; Tue, 23 Jun 2020 23:57:55 +0300 From: talshn@mellanox.com To: dev@dpdk.org Cc: thomas@monjalon.net, pallavi.kadam@intel.com, dmitry.kozliuk@gmail.com, david.marchand@redhat.com, ranjit.menon@intel.com, navasile@linux.microsoft.com, harini.ramakrishnan@microsoft.com, ocardona@microsoft.com, bruce.richardson@intel.com, Tal Shnaiderman Date: Tue, 23 Jun 2020 23:57:21 +0300 Message-Id: <20200623205721.21200-3-talshn@mellanox.com> X-Mailer: git-send-email 2.16.1.windows.4 In-Reply-To: <20200623205721.21200-1-talshn@mellanox.com> References: <20200608083227.16020-2-talshn@mellanox.com> <20200623205721.21200-1-talshn@mellanox.com> Subject: [dpdk-dev] [PATCH v3 2/2] eal/windows: support debug calls X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Tal Shnaiderman Support the debug functions in eal_common_debug.c for Windows. Implementation of rte_dump_stack to get a backtrace similarly to Unix and of rte_eal_cleanup in eal.c. Signed-off-by: Tal Shnaiderman --- config/meson.build | 1 + lib/librte_eal/common/meson.build | 1 + lib/librte_eal/windows/eal.c | 9 ++++- lib/librte_eal/windows/eal_debug.c | 76 ++++++++++++++++++++++++++++++++++---- 4 files changed, 78 insertions(+), 9 deletions(-) diff --git a/config/meson.build b/config/meson.build index bb64c3bd43..351e268c1f 100644 --- a/config/meson.build +++ b/config/meson.build @@ -276,6 +276,7 @@ if is_windows endif add_project_link_arguments('-ladvapi32', '-lsetupapi', language: 'c') + add_project_link_arguments('-ldbghelp', language: 'c') endif if get_option('b_lto') diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index 02e5d28d45..036ff62ed6 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -7,6 +7,7 @@ if is_windows sources += files( 'eal_common_bus.c', 'eal_common_class.c', + 'eal_common_debug.c', 'eal_common_devargs.c', 'eal_common_dynmem.c', 'eal_common_errno.c', diff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c index b6bffd3d92..97c8427c73 100644 --- a/lib/librte_eal/windows/eal.c +++ b/lib/librte_eal/windows/eal.c @@ -274,7 +274,14 @@ __rte_trace_point_register(rte_trace_point_t *trace, const char *name, return -ENOTSUP; } - /* Launch threads, called at application init(). */ +int +rte_eal_cleanup(void) +{ + eal_cleanup_config(&internal_config); + return 0; +} + +/* Launch threads, called at application init(). */ int rte_eal_init(int argc, char **argv) { diff --git a/lib/librte_eal/windows/eal_debug.c b/lib/librte_eal/windows/eal_debug.c index 669be6ff97..56ed70df7d 100644 --- a/lib/librte_eal/windows/eal_debug.c +++ b/lib/librte_eal/windows/eal_debug.c @@ -5,16 +5,76 @@ #include #include #include +#include - /* call abort(), it will generate a coredump if enabled */ +#include + +#define BACKTRACE_SIZE 256 + +/* dump the stack of the calling core */ void -__rte_panic(const char *funcname, const char *format, ...) +rte_dump_stack(void) { - va_list ap; + 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: []\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; + } + } - rte_log(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, "PANIC in %s():\n", funcname); - va_start(ap, format); - rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap); - va_end(ap); - abort(); + rte_log(RTE_LOG_ERR, RTE_LOGTYPE_EAL, + "%d: [%s (%s+0x%0llx)[0x%0llX]]\n", frame_num, + error_code ? "" : line.FileName, + symbol_info->Name, sym_disp, symbol_info->Address); + frame_num--; + } +end: + ret = SymCleanup(process); + if (!ret) + RTE_LOG_WIN32_ERR("SymCleanup()"); } -- 2.16.1.windows.4