Maxim Uvarov has uploaded a new change for review.

  https://review.linaro.org/13134

Change subject: linux-generic: add stacktrace
......................................................................

linux-generic: add stacktrace

Add initial version for more verbose stacktrace for linux-
generic odp platform.
Usage:

export ODP_STACKTRACE_ENABLE=y

Thread 0 terminated with signal=11 (SIGSEGV)
./test/performance/odp_scheduling[0x4250b3]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x10330)[0x7f7ae5cc1330]
./test/performance/odp_scheduling[0x40a064]
./test/performance/odp_scheduling(main+0x2c1)[0x40a5dc]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f7ae590df45]
./test/performance/odp_scheduling[0x408ed9]
odp_stacktrace.c:57:fault_handler():Program interrupted
Aborted

Then convert address to function symbol with add2line:

addr2line  -e ./test/performance/odp_scheduling 0x4250b3
/opt/Linaro/odp3.git/platform/linux-generic/odp_stacktrace.c:49

Change-Id: Id9df73633583e93dc4fb39f0a90fdf6c7c56a6cc
Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org>
---
M platform/linux-generic/Makefile.am
M platform/linux-generic/include/odp_debug_internal.h
M platform/linux-generic/odp_init.c
A platform/linux-generic/odp_stacktrace.c
4 files changed, 81 insertions(+), 0 deletions(-)


  git pull ssh://review.linaro.org:29418/lng/odp refs/changes/34/13134/1

diff --git a/platform/linux-generic/Makefile.am 
b/platform/linux-generic/Makefile.am
index c8fd8cb..1a7be32 100644
--- a/platform/linux-generic/Makefile.am
+++ b/platform/linux-generic/Makefile.am
@@ -174,6 +174,7 @@
                           odp_spinlock.c \
                           odp_spinlock_recursive.c \
                           odp_system_info.c \
+                          odp_stacktrace.c \
                           odp_thread.c \
                           odp_thrmask.c \
                           odp_ticketlock.c \
diff --git a/platform/linux-generic/include/odp_debug_internal.h 
b/platform/linux-generic/include/odp_debug_internal.h
index 02ae87a..a43705f 100644
--- a/platform/linux-generic/include/odp_debug_internal.h
+++ b/platform/linux-generic/include/odp_debug_internal.h
@@ -83,6 +83,8 @@
 #define ODP_PRINT(fmt, ...) \
        odp_global_data.log_fn(ODP_LOG_PRINT, " " fmt, ##__VA_ARGS__)
 
+void _odp_stracktrace_init(void);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/odp_init.c 
b/platform/linux-generic/odp_init.c
index f534759..875381f 100644
--- a/platform/linux-generic/odp_init.c
+++ b/platform/linux-generic/odp_init.c
@@ -33,6 +33,9 @@
                        odp_global_data.abort_fn = params->abort_fn;
        }
 
+       if (getenv("ODP_STACKTRACE_ENABLE"))
+               _odp_stracktrace_init();
+
        if (odp_cpumask_init_global(params)) {
                ODP_ERR("ODP cpumask init failed.\n");
                goto init_failed;
diff --git a/platform/linux-generic/odp_stacktrace.c 
b/platform/linux-generic/odp_stacktrace.c
new file mode 100644
index 0000000..76a8803
--- /dev/null
+++ b/platform/linux-generic/odp_stacktrace.c
@@ -0,0 +1,75 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include <odp_posix_extensions.h>
+
+#include <odp/api/spinlock.h>
+#include <odp_debug_internal.h>
+
+#include <string.h>
+#include <stdio.h>
+#include <signal.h>
+#include <execinfo.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+static odp_spinlock_t print_lock;
+
+static void fault_handler(int signal)
+{
+       size_t num_stack_frames;
+       const char  *signal_name;
+       void  *bt_array[4096];
+       sigset_t sigset;
+
+       /* disable all signals */
+       sigfillset(&sigset);
+       sigprocmask(SIG_BLOCK, &sigset, NULL);
+
+       switch (signal) {
+       case SIGILL:
+               signal_name = "SIGILL";   break;
+       case SIGFPE:
+               signal_name = "SIGFPE";   break;
+       case SIGSEGV:
+               signal_name = "SIGSEGV";  break;
+       case SIGTERM:
+               signal_name = "SIGTERM";  break;
+       case SIGBUS:
+               signal_name = "SIGBUS";   break;
+       default:
+               signal_name = "UNKNOWN";  break;
+       }
+
+       odp_spinlock_lock(&print_lock);
+       num_stack_frames = backtrace(bt_array, 100);
+       fprintf(stderr, "\nThread %d terminated with signal=%u (%s)\n",
+               odp_thread_id(), signal, signal_name);
+       backtrace_symbols_fd(bt_array, num_stack_frames, fileno(stderr));
+       fflush(NULL);
+       sync();
+       odp_spinlock_unlock(&print_lock);
+
+       ODP_ABORT("Program interrupted\n");
+}
+
+void _odp_stracktrace_init(void)
+{
+       struct sigaction signal_action;
+
+       odp_spinlock_init(&print_lock);
+
+       memset(&signal_action, 0, sizeof(signal_action));
+       signal_action.sa_handler = fault_handler;
+       sigfillset(&signal_action.sa_mask);
+
+       sigaction(SIGILL,  &signal_action, NULL);
+       sigaction(SIGFPE,  &signal_action, NULL);
+       sigaction(SIGSEGV, &signal_action, NULL);
+       sigaction(SIGTERM, &signal_action, NULL);
+       sigaction(SIGBUS,  &signal_action, NULL);
+}

-- 
To view, visit https://review.linaro.org/13134
To unsubscribe, visit https://review.linaro.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id9df73633583e93dc4fb39f0a90fdf6c7c56a6cc
Gerrit-PatchSet: 1
Gerrit-Project: lng/odp
Gerrit-Branch: master
Gerrit-Owner: Maxim Uvarov <maxim.uva...@linaro.org>

Reply via email to