#include "espik_debug.h" #include #include #include #ifdef __GLIBC__ # include #endif /* __GLIBC__ */ #if _ESPIK_DEBUG_ # include #endif /* _ESPIK_DEBUG_ */ inline void espik_debug_bt (int num) { #ifdef __GLIBC__ # if _ESPIK_DEBUG_ void* array[128]; size_t size; char** strings; size_t i; /* if (!debug_bt) return; */ fprintf(stderr, "\n***** Backtrace (Signal %d) *****\n", num); size = backtrace(array, 128); strings = backtrace_symbols(array, size); for (i = 0 ; i < size ; i++) fprintf(stderr, "%s\n", strings[i]); if (strings) free(strings); # endif /* _ESPIK_DEBUG_ */ #endif /* __GLIBC__ */ #ifndef __GLIBC__ fprintf(stderr, "Your system doesn't have glibc. Backtraces disabled. But program receive signal %d.\n", num); #endif /* __GLIBC__ */ } void espik_debug_init() { #if _ESPIK_DEBUG_ struct sigaction sa; sa.sa_handler = espik_debug_bt; sigaction(SIGSEGV, &sa, (struct sigaction *)0); sigaction(SIGINT, &sa, (struct sigaction *)0); sigaction(SIGKILL, &sa, (struct sigaction *)0); #endif } void kill_me (short num) { espik_debug_bt(num); exit (num); }