#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#define __USE_GNU
#include <ucontext.h>
static void sigsegv_handler(int signum, struct siginfo * info, void * ptr)
{
static const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"};
int i;
struct ucontext *ucontext = (struct ucontext *)ptr;
printf("Segmentation Fault Trace:\n");
printf("info.si_signo %d\n", signum);
printf("info.si_errno %d\n", info->si_errno);
printf("info.si_code %d (%s)\n", info->si_code, si_codes[info->si_code]);
printf("info.si_addr %p\n", info->si_addr);
/*for x86*/
printf("the eip 0x%x\n", ucontext->uc_mcontext.gregs[REG_EIP]);
exit (-1);
}
static void catch_sigsegv ()
{
struct sigaction action;
memset (&action, 0, sizeof(action));
action.sa_sigaction = sigsegv_handler;
action.sa_flags = SA_SIGINFO;
if (sigaction(SIGSEGV, &action, NULL) < 0)
{
perror("sigaction");
}
return;
}
void dummy_function (void)
{
unsigned char *ptr = 0x00;
*ptr = 0x00;
}
int main (void)
{
catch_sigsegv();
dummy_function ();
return 0;
}
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#define __USE_GNU
#include <ucontext.h>
static void sigsegv_handler(int signum, struct siginfo * info, void * ptr)
{
static const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"};
int i;
struct ucontext *ucontext = (struct ucontext *)ptr;
printf("Segmentation Fault Trace:\n");
printf("info.si_signo %d\n", signum);
printf("info.si_errno %d\n", info->si_errno);
printf("info.si_code %d (%s)\n", info->si_code, si_codes[info->si_code]);
printf("info.si_addr %p\n", info->si_addr);
/*for x86*/
printf("the eip 0x%x\n", ucontext->uc_mcontext.gregs[REG_EIP]);
exit (-1);
}
static void catch_sigsegv ()
{
struct sigaction action;
memset (&action, 0, sizeof(action));
action.sa_sigaction = sigsegv_handler;
action.sa_flags = SA_SIGINFO;
if (sigaction(SIGSEGV, &action, NULL) < 0)
{
perror("sigaction");
}
return;
}
void dummy_function (void)
{
unsigned char *ptr = 0x00;
*ptr = 0x00;
}
int main (void)
{
catch_sigsegv();
dummy_function ();
return 0;
}
#include <execinfo.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> void myfunc3(void) { int j, nptrs; #define SIZE 100 void *buffer[100]; char **strings; nptrs = backtrace(buffer, SIZE); printf("backtrace() returned %d addresses\n", nptrs); /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) would produce similar output to the following: */ strings = backtrace_symbols(buffer, nptrs); if (strings == NULL) { perror("backtrace_symbols"); exit(EXIT_FAILURE); } for (j = 0; j < nptrs; j++) printf("%s\n", strings[j]); free(strings); } static void /* "static" means don't export the symbol... */ myfunc2(void) { myfunc3(); } void myfunc(int ncalls) { if (ncalls > 1) myfunc(ncalls - 1); else myfunc2(); } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "%s num-calls\n", argv[0]); exit(EXIT_FAILURE); } myfunc(atoi(argv[1])); exit(EXIT_SUCCESS); }