* [dpdk-dev] [PATCH v2 0/2] Support EAL debug functions on Windows
@ 2020-06-08 8:32 talshn
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 1/2] eal: move OS common debug functions to single file talshn
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 2/2] eal/windows: support debug calls talshn
0 siblings, 2 replies; 9+ messages in thread
From: talshn @ 2020-06-08 8:32 UTC (permalink / raw)
To: dev
Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
ranjit.menon, navasile, harini.ramakrishnan, ocardona,
bruce.richardson, Tal Shnaiderman
From: Tal Shnaiderman <talshn@mellanox.com>
This patchset adds support for the EAL debug function on Windows
by implementing backtracing in rte_dump_stack and
cleanup calls in rte_eal_cleanup.
Additionally, the functions rte_exit, __rte_panic
and rte_dump_registers were moved to a common file
to avoid code duplication.
---
v2: Fix style and cross-compiling MinGW-w64 on Linux error[DmitryK]
---
Tal Shnaiderman (2):
eal: move OS common debug functions to single file
eal/windows: support debug calls
config/meson.build | 1 +
lib/librte_eal/common/eal_common_debug.c | 58 ++++++++++++++++++++++++
lib/librte_eal/common/meson.build | 2 +
lib/librte_eal/freebsd/Makefile | 1 +
lib/librte_eal/freebsd/eal_debug.c | 49 --------------------
lib/librte_eal/linux/Makefile | 1 +
lib/librte_eal/linux/eal_debug.c | 49 --------------------
lib/librte_eal/windows/eal.c | 7 +++
lib/librte_eal/windows/eal_debug.c | 76 ++++++++++++++++++++++++++++----
9 files changed, 138 insertions(+), 106 deletions(-)
create mode 100644 lib/librte_eal/common/eal_common_debug.c
--
2.16.1.windows.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v2 1/2] eal: move OS common debug functions to single file
2020-06-08 8:32 [dpdk-dev] [PATCH v2 0/2] Support EAL debug functions on Windows talshn
@ 2020-06-08 8:32 ` talshn
2020-06-23 17:46 ` Thomas Monjalon
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows talshn
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 2/2] eal/windows: support debug calls talshn
1 sibling, 2 replies; 9+ messages in thread
From: talshn @ 2020-06-08 8:32 UTC (permalink / raw)
To: dev
Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
ranjit.menon, navasile, harini.ramakrishnan, ocardona,
bruce.richardson, Tal Shnaiderman
From: Tal Shnaiderman <talshn@mellanox.com>
Move common functions between Unix and Windows to eal_common_debug.c.
Those functions are rte_exit, __rte_panic and rte_dump_registers
which has the same implementation on Unix and Windows.
Signed-off-by: Tal Shnaiderman <talshn@mellanox.com>
---
lib/librte_eal/common/eal_common_debug.c | 58 ++++++++++++++++++++++++++++++++
lib/librte_eal/common/meson.build | 1 +
lib/librte_eal/freebsd/Makefile | 1 +
lib/librte_eal/freebsd/eal_debug.c | 49 ---------------------------
lib/librte_eal/linux/Makefile | 1 +
lib/librte_eal/linux/eal_debug.c | 49 ---------------------------
6 files changed, 61 insertions(+), 98 deletions(-)
create mode 100644 lib/librte_eal/common/eal_common_debug.c
diff --git a/lib/librte_eal/common/eal_common_debug.c b/lib/librte_eal/common/eal_common_debug.c
new file mode 100644
index 0000000000..ae4bee675d
--- /dev/null
+++ b/lib/librte_eal/common/eal_common_debug.c
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2020 Mellanox Technologies, Ltd
+ */
+#include <stdarg.h>
+#include <rte_eal.h>
+#include <rte_log.h>
+#include <rte_debug.h>
+
+/* not implemented */
+void
+rte_dump_registers(void)
+{
+ return;
+}
+
+/* call abort(), it will generate a coredump if enabled */
+void
+__rte_panic(const char *funcname, const char *format, ...)
+{
+ va_list ap;
+
+ 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);
+ rte_dump_stack();
+ rte_dump_registers();
+ abort();
+}
+
+/*
+ * Like rte_panic this terminates the application. However, no traceback is
+ * provided and no core-dump is generated.
+ */
+void
+rte_exit(int exit_code, const char *format, ...)
+{
+ va_list ap;
+
+ if (exit_code != 0)
+ RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
+ " Cause: ", exit_code);
+
+ va_start(ap, format);
+ rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
+ va_end(ap);
+
+#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
+ if (rte_eal_cleanup() != 0)
+ RTE_LOG(CRIT, EAL,
+ "EAL could not release all resources\n");
+ exit(exit_code);
+#else
+ rte_dump_stack();
+ rte_dump_registers();
+ abort();
+#endif
+}
diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build
index 55aaeb18e1..2bde920597 100644
--- a/lib/librte_eal/common/meson.build
+++ b/lib/librte_eal/common/meson.build
@@ -22,6 +22,7 @@ sources += files(
'eal_common_bus.c',
'eal_common_cpuflags.c',
'eal_common_class.c',
+ 'eal_common_debug.c',
'eal_common_devargs.c',
'eal_common_dev.c',
'eal_common_errno.c',
diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile
index af95386d48..81fa1f29c6 100644
--- a/lib/librte_eal/freebsd/Makefile
+++ b/lib/librte_eal/freebsd/Makefile
@@ -51,6 +51,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_cpuflags.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_hypervisor.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_string_fns.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_hexdump.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_debug.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_devargs.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_class.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_bus.c
diff --git a/lib/librte_eal/freebsd/eal_debug.c b/lib/librte_eal/freebsd/eal_debug.c
index 5d92500bf5..64dab4e0da 100644
--- a/lib/librte_eal/freebsd/eal_debug.c
+++ b/lib/librte_eal/freebsd/eal_debug.c
@@ -41,52 +41,3 @@ void rte_dump_stack(void)
free(symb);
#endif /* RTE_BACKTRACE */
}
-
-/* not implemented in this environment */
-void rte_dump_registers(void)
-{
- return;
-}
-
-/* call abort(), it will generate a coredump if enabled */
-void __rte_panic(const char *funcname, const char *format, ...)
-{
- va_list ap;
-
- 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);
- rte_dump_stack();
- rte_dump_registers();
- abort();
-}
-
-/*
- * Like rte_panic this terminates the application. However, no traceback is
- * provided and no core-dump is generated.
- */
-void
-rte_exit(int exit_code, const char *format, ...)
-{
- va_list ap;
-
- if (exit_code != 0)
- RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
- " Cause: ", exit_code);
-
- va_start(ap, format);
- rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
- va_end(ap);
-
-#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
- if (rte_eal_cleanup() != 0)
- RTE_LOG(CRIT, EAL,
- "EAL could not release all resources\n");
- exit(exit_code);
-#else
- rte_dump_stack();
- rte_dump_registers();
- abort();
-#endif
-}
diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile
index 48cc34844a..77da140bee 100644
--- a/lib/librte_eal/linux/Makefile
+++ b/lib/librte_eal/linux/Makefile
@@ -58,6 +58,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_cpuflags.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_hypervisor.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_string_fns.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_hexdump.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_debug.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_devargs.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_class.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_bus.c
diff --git a/lib/librte_eal/linux/eal_debug.c b/lib/librte_eal/linux/eal_debug.c
index 5d92500bf5..64dab4e0da 100644
--- a/lib/librte_eal/linux/eal_debug.c
+++ b/lib/librte_eal/linux/eal_debug.c
@@ -41,52 +41,3 @@ void rte_dump_stack(void)
free(symb);
#endif /* RTE_BACKTRACE */
}
-
-/* not implemented in this environment */
-void rte_dump_registers(void)
-{
- return;
-}
-
-/* call abort(), it will generate a coredump if enabled */
-void __rte_panic(const char *funcname, const char *format, ...)
-{
- va_list ap;
-
- 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);
- rte_dump_stack();
- rte_dump_registers();
- abort();
-}
-
-/*
- * Like rte_panic this terminates the application. However, no traceback is
- * provided and no core-dump is generated.
- */
-void
-rte_exit(int exit_code, const char *format, ...)
-{
- va_list ap;
-
- if (exit_code != 0)
- RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
- " Cause: ", exit_code);
-
- va_start(ap, format);
- rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
- va_end(ap);
-
-#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
- if (rte_eal_cleanup() != 0)
- RTE_LOG(CRIT, EAL,
- "EAL could not release all resources\n");
- exit(exit_code);
-#else
- rte_dump_stack();
- rte_dump_registers();
- abort();
-#endif
-}
--
2.16.1.windows.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v2 2/2] eal/windows: support debug calls
2020-06-08 8:32 [dpdk-dev] [PATCH v2 0/2] Support EAL debug functions on Windows talshn
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 1/2] eal: move OS common debug functions to single file talshn
@ 2020-06-08 8:32 ` talshn
1 sibling, 0 replies; 9+ messages in thread
From: talshn @ 2020-06-08 8:32 UTC (permalink / raw)
To: dev
Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
ranjit.menon, navasile, harini.ramakrishnan, ocardona,
bruce.richardson, Tal Shnaiderman
From: Tal Shnaiderman <talshn@mellanox.com>
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 <talshn@mellanox.com>
---
config/meson.build | 1 +
lib/librte_eal/common/meson.build | 1 +
lib/librte_eal/windows/eal.c | 7 ++++
lib/librte_eal/windows/eal_debug.c | 76 ++++++++++++++++++++++++++++++++++----
4 files changed, 77 insertions(+), 8 deletions(-)
diff --git a/config/meson.build b/config/meson.build
index 43ab113106..5f1e257da7 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -268,6 +268,7 @@ if is_windows
if cc.get_id() == 'gcc'
add_project_arguments('-D__USE_MINGW_ANSI_STDIO', language: 'c')
endif
+ 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 2bde920597..a1c362895b 100644
--- a/lib/librte_eal/common/meson.build
+++ b/lib/librte_eal/common/meson.build
@@ -8,6 +8,7 @@ if is_windows
'eal_common_bus.c',
'eal_common_class.c',
'eal_common_devargs.c',
+ 'eal_common_debug.c',
'eal_common_errno.c',
'eal_common_launch.c',
'eal_common_lcore.c',
diff --git a/lib/librte_eal/windows/eal.c b/lib/librte_eal/windows/eal.c
index d084606a66..7278f2f07c 100644
--- a/lib/librte_eal/windows/eal.c
+++ b/lib/librte_eal/windows/eal.c
@@ -221,6 +221,13 @@ rte_eal_init_alert(const char *msg)
RTE_LOG(ERR, EAL, "%s\n", msg);
}
+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 <stdarg.h>
#include <rte_log.h>
#include <rte_debug.h>
+#include <rte_windows.h>
- /* call abort(), it will generate a coredump if enabled */
+#include <dbghelp.h>
+
+#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: [<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;
+ }
+ }
- 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 ? "<unknown>" : 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
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [dpdk-dev] [PATCH v2 1/2] eal: move OS common debug functions to single file
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 1/2] eal: move OS common debug functions to single file talshn
@ 2020-06-23 17:46 ` Thomas Monjalon
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows talshn
1 sibling, 0 replies; 9+ messages in thread
From: Thomas Monjalon @ 2020-06-23 17:46 UTC (permalink / raw)
To: Tal Shnaiderman
Cc: dev, pallavi.kadam, dmitry.kozliuk, david.marchand, ranjit.menon,
navasile, harini.ramakrishnan, ocardona, bruce.richardson
08/06/2020 10:32, talshn@mellanox.com:
> From: Tal Shnaiderman <talshn@mellanox.com>
>
> Move common functions between Unix and Windows to eal_common_debug.c.
[...]
> --- /dev/null
> +++ b/lib/librte_eal/common/eal_common_debug.c
> @@ -0,0 +1,58 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2020 Mellanox Technologies, Ltd
I think you should keep Intel copyright for this code.
> + */
> +#include <stdarg.h>
A blank line is missing after the copyright block.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 1/2] eal: move OS common debug functions to single file talshn
2020-06-23 17:46 ` Thomas Monjalon
@ 2020-06-23 20:57 ` talshn
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 1/2] eal: move OS common debug functions to single file talshn
` (2 more replies)
1 sibling, 3 replies; 9+ messages in thread
From: talshn @ 2020-06-23 20:57 UTC (permalink / raw)
To: dev
Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
ranjit.menon, navasile, harini.ramakrishnan, ocardona,
bruce.richardson, Tal Shnaiderman
From: Tal Shnaiderman <talshn@mellanox.com>
This patchset adds support for the EAL debug function on Windows by implementing backtracing in rte_dump_stack and cleanup calls in rte_eal_cleanup.
Additionally, the functions rte_exit, __rte_panic and rte_dump_registers were moved to a common file to avoid code duplication.
---
v3: Fix license comment[ThomasM]
v2: Fix style and cross-compiling MinGW-w64 on Linux error[DmitryK]
---
Tal Shnaiderman (2):
eal: move OS common debug functions to single file
eal/windows: support debug calls
config/meson.build | 1 +
lib/librte_eal/common/eal_common_debug.c | 59 +++++++++++++++++++++++++
lib/librte_eal/common/meson.build | 2 +
lib/librte_eal/freebsd/Makefile | 1 +
lib/librte_eal/freebsd/eal_debug.c | 49 --------------------
lib/librte_eal/linux/Makefile | 1 +
lib/librte_eal/linux/eal_debug.c | 49 --------------------
lib/librte_eal/windows/eal.c | 9 +++-
lib/librte_eal/windows/eal_debug.c | 76 ++++++++++++++++++++++++++++----
9 files changed, 140 insertions(+), 107 deletions(-)
create mode 100644 lib/librte_eal/common/eal_common_debug.c
--
2.16.1.windows.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v3 1/2] eal: move OS common debug functions to single file
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows talshn
@ 2020-06-23 20:57 ` talshn
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 2/2] eal/windows: support debug calls talshn
2020-06-23 22:48 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows Dmitry Kozlyuk
2 siblings, 0 replies; 9+ messages in thread
From: talshn @ 2020-06-23 20:57 UTC (permalink / raw)
To: dev
Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
ranjit.menon, navasile, harini.ramakrishnan, ocardona,
bruce.richardson, Tal Shnaiderman
From: Tal Shnaiderman <talshn@mellanox.com>
Move common functions between Unix and Windows to eal_common_debug.c.
Those functions are rte_exit, __rte_panic and rte_dump_registers
which has the same implementation on Unix and Windows.
Signed-off-by: Tal Shnaiderman <talshn@mellanox.com>
---
lib/librte_eal/common/eal_common_debug.c | 59 ++++++++++++++++++++++++++++++++
lib/librte_eal/common/meson.build | 1 +
lib/librte_eal/freebsd/Makefile | 1 +
lib/librte_eal/freebsd/eal_debug.c | 49 --------------------------
lib/librte_eal/linux/Makefile | 1 +
lib/librte_eal/linux/eal_debug.c | 49 --------------------------
6 files changed, 62 insertions(+), 98 deletions(-)
create mode 100644 lib/librte_eal/common/eal_common_debug.c
diff --git a/lib/librte_eal/common/eal_common_debug.c b/lib/librte_eal/common/eal_common_debug.c
new file mode 100644
index 0000000000..722468754d
--- /dev/null
+++ b/lib/librte_eal/common/eal_common_debug.c
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2014 Intel Corporation
+ */
+
+#include <stdarg.h>
+#include <rte_eal.h>
+#include <rte_log.h>
+#include <rte_debug.h>
+
+/* not implemented */
+void
+rte_dump_registers(void)
+{
+ return;
+}
+
+/* call abort(), it will generate a coredump if enabled */
+void
+__rte_panic(const char *funcname, const char *format, ...)
+{
+ va_list ap;
+
+ 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);
+ rte_dump_stack();
+ rte_dump_registers();
+ abort();
+}
+
+/*
+ * Like rte_panic this terminates the application. However, no traceback is
+ * provided and no core-dump is generated.
+ */
+void
+rte_exit(int exit_code, const char *format, ...)
+{
+ va_list ap;
+
+ if (exit_code != 0)
+ RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
+ " Cause: ", exit_code);
+
+ va_start(ap, format);
+ rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
+ va_end(ap);
+
+#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
+ if (rte_eal_cleanup() != 0)
+ RTE_LOG(CRIT, EAL,
+ "EAL could not release all resources\n");
+ exit(exit_code);
+#else
+ rte_dump_stack();
+ rte_dump_registers();
+ abort();
+#endif
+}
diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build
index 4bdf77922f..02e5d28d45 100644
--- a/lib/librte_eal/common/meson.build
+++ b/lib/librte_eal/common/meson.build
@@ -35,6 +35,7 @@ sources += files(
'eal_common_bus.c',
'eal_common_cpuflags.c',
'eal_common_class.c',
+ 'eal_common_debug.c',
'eal_common_devargs.c',
'eal_common_dev.c',
'eal_common_errno.c',
diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile
index d18c00eeae..9988ea5b48 100644
--- a/lib/librte_eal/freebsd/Makefile
+++ b/lib/librte_eal/freebsd/Makefile
@@ -52,6 +52,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_cpuflags.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_hypervisor.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_string_fns.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_hexdump.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_debug.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_devargs.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_class.c
SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_bus.c
diff --git a/lib/librte_eal/freebsd/eal_debug.c b/lib/librte_eal/freebsd/eal_debug.c
index 5d92500bf5..64dab4e0da 100644
--- a/lib/librte_eal/freebsd/eal_debug.c
+++ b/lib/librte_eal/freebsd/eal_debug.c
@@ -41,52 +41,3 @@ void rte_dump_stack(void)
free(symb);
#endif /* RTE_BACKTRACE */
}
-
-/* not implemented in this environment */
-void rte_dump_registers(void)
-{
- return;
-}
-
-/* call abort(), it will generate a coredump if enabled */
-void __rte_panic(const char *funcname, const char *format, ...)
-{
- va_list ap;
-
- 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);
- rte_dump_stack();
- rte_dump_registers();
- abort();
-}
-
-/*
- * Like rte_panic this terminates the application. However, no traceback is
- * provided and no core-dump is generated.
- */
-void
-rte_exit(int exit_code, const char *format, ...)
-{
- va_list ap;
-
- if (exit_code != 0)
- RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
- " Cause: ", exit_code);
-
- va_start(ap, format);
- rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
- va_end(ap);
-
-#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
- if (rte_eal_cleanup() != 0)
- RTE_LOG(CRIT, EAL,
- "EAL could not release all resources\n");
- exit(exit_code);
-#else
- rte_dump_stack();
- rte_dump_registers();
- abort();
-#endif
-}
diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile
index 5d97073ed2..180fc51984 100644
--- a/lib/librte_eal/linux/Makefile
+++ b/lib/librte_eal/linux/Makefile
@@ -60,6 +60,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_cpuflags.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_hypervisor.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_string_fns.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_hexdump.c
+SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_debug.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_devargs.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_class.c
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_bus.c
diff --git a/lib/librte_eal/linux/eal_debug.c b/lib/librte_eal/linux/eal_debug.c
index 5d92500bf5..64dab4e0da 100644
--- a/lib/librte_eal/linux/eal_debug.c
+++ b/lib/librte_eal/linux/eal_debug.c
@@ -41,52 +41,3 @@ void rte_dump_stack(void)
free(symb);
#endif /* RTE_BACKTRACE */
}
-
-/* not implemented in this environment */
-void rte_dump_registers(void)
-{
- return;
-}
-
-/* call abort(), it will generate a coredump if enabled */
-void __rte_panic(const char *funcname, const char *format, ...)
-{
- va_list ap;
-
- 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);
- rte_dump_stack();
- rte_dump_registers();
- abort();
-}
-
-/*
- * Like rte_panic this terminates the application. However, no traceback is
- * provided and no core-dump is generated.
- */
-void
-rte_exit(int exit_code, const char *format, ...)
-{
- va_list ap;
-
- if (exit_code != 0)
- RTE_LOG(CRIT, EAL, "Error - exiting with code: %d\n"
- " Cause: ", exit_code);
-
- va_start(ap, format);
- rte_vlog(RTE_LOG_CRIT, RTE_LOGTYPE_EAL, format, ap);
- va_end(ap);
-
-#ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR
- if (rte_eal_cleanup() != 0)
- RTE_LOG(CRIT, EAL,
- "EAL could not release all resources\n");
- exit(exit_code);
-#else
- rte_dump_stack();
- rte_dump_registers();
- abort();
-#endif
-}
--
2.16.1.windows.4
^ permalink raw reply [flat|nested] 9+ messages in thread
* [dpdk-dev] [PATCH v3 2/2] eal/windows: support debug calls
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows talshn
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 1/2] eal: move OS common debug functions to single file talshn
@ 2020-06-23 20:57 ` talshn
2020-06-23 22:48 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows Dmitry Kozlyuk
2 siblings, 0 replies; 9+ messages in thread
From: talshn @ 2020-06-23 20:57 UTC (permalink / raw)
To: dev
Cc: thomas, pallavi.kadam, dmitry.kozliuk, david.marchand,
ranjit.menon, navasile, harini.ramakrishnan, ocardona,
bruce.richardson, Tal Shnaiderman
From: Tal Shnaiderman <talshn@mellanox.com>
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 <talshn@mellanox.com>
---
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 <stdarg.h>
#include <rte_log.h>
#include <rte_debug.h>
+#include <rte_windows.h>
- /* call abort(), it will generate a coredump if enabled */
+#include <dbghelp.h>
+
+#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: [<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;
+ }
+ }
- 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 ? "<unknown>" : 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
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows talshn
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 1/2] eal: move OS common debug functions to single file talshn
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 2/2] eal/windows: support debug calls talshn
@ 2020-06-23 22:48 ` Dmitry Kozlyuk
2020-06-24 9:17 ` Thomas Monjalon
2 siblings, 1 reply; 9+ messages in thread
From: Dmitry Kozlyuk @ 2020-06-23 22:48 UTC (permalink / raw)
To: talshn
Cc: dev, thomas, pallavi.kadam, david.marchand, ranjit.menon,
navasile, harini.ramakrishnan, ocardona, bruce.richardson
On Tue, 23 Jun 2020 23:57:19 +0300, talshn@mellanox.com wrote:
> From: Tal Shnaiderman <talshn@mellanox.com>
>
> This patchset adds support for the EAL debug function on Windows by implementing backtracing in rte_dump_stack and cleanup calls in rte_eal_cleanup.
>
> Additionally, the functions rte_exit, __rte_panic and rte_dump_registers were moved to a common file to avoid code duplication.
>
> ---
> v3: Fix license comment[ThomasM]
>
> v2: Fix style and cross-compiling MinGW-w64 on Linux error[DmitryK]
> ---
Tested-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
--
Dmitry Kozlyuk
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows
2020-06-23 22:48 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows Dmitry Kozlyuk
@ 2020-06-24 9:17 ` Thomas Monjalon
0 siblings, 0 replies; 9+ messages in thread
From: Thomas Monjalon @ 2020-06-24 9:17 UTC (permalink / raw)
To: talshn
Cc: dev, pallavi.kadam, david.marchand, ranjit.menon, navasile,
harini.ramakrishnan, ocardona, bruce.richardson, Dmitry Kozlyuk
24/06/2020 00:48, Dmitry Kozlyuk:
> On Tue, 23 Jun 2020 23:57:19 +0300, talshn@mellanox.com wrote:
>
> > From: Tal Shnaiderman <talshn@mellanox.com>
> >
> > This patchset adds support for the EAL debug function on Windows by implementing backtracing in rte_dump_stack and cleanup calls in rte_eal_cleanup.
> >
> > Additionally, the functions rte_exit, __rte_panic and rte_dump_registers were moved to a common file to avoid code duplication.
>
> Tested-by: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Applied, thanks
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2020-06-24 9:18 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-08 8:32 [dpdk-dev] [PATCH v2 0/2] Support EAL debug functions on Windows talshn
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 1/2] eal: move OS common debug functions to single file talshn
2020-06-23 17:46 ` Thomas Monjalon
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows talshn
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 1/2] eal: move OS common debug functions to single file talshn
2020-06-23 20:57 ` [dpdk-dev] [PATCH v3 2/2] eal/windows: support debug calls talshn
2020-06-23 22:48 ` [dpdk-dev] [PATCH v3 0/2] Support EAL debug functions on Windows Dmitry Kozlyuk
2020-06-24 9:17 ` Thomas Monjalon
2020-06-08 8:32 ` [dpdk-dev] [PATCH v2 2/2] eal/windows: support debug calls talshn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).