blob: 601ef7cc433e48a661f485b75b9d00e5adf823ef (
plain) (
tree)
|
|
#include "espik_debug.h"
#ifdef __GLIBC__
# include <execinfo.h>
#endif /* __GLIBC__ */
#if _ESPIK_DEBUG
# include <stdio.h>
# include <signal.h>
#endif /* _ESPIK_DEBUG */
inline void espik_debug_bt (int num)
{
#ifdef __GLIBC__ && _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);
#else
# ifdef __GLIBC__
fprintf(stderr, "Your system doesn't have glibc. Backtraces disabled. But program receive signal %d.\n", num);
# endif /* __GLIBC__ */
#endif /* __GLIBC__ && _ESPIK_DEBUG */
}
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
}
|