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>