aboutsummaryrefslogblamecommitdiff
path: root/src/espik_debug.c
blob: 601ef7cc433e48a661f485b75b9d00e5adf823ef (plain) (tree)
1
2
3
4
5
6
7
8
9
10
                        

                

                            
 



                          


                                    
                                















                                                                      
                       
                                                                                                                      

                                               



                       
                





                                                       
      
 
#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
}