#include #include #include #include char* argv0 = NULL; void signal_caught(int signal) { char argv0_local[PATH_MAX]; strcpy(argv0_local, argv0); if (fork() == 0) { char *argv[3] = { "./crashreporter", argv0_local, NULL }; if (execve("./crashreporter.rb", argv, NULL) != 0) { perror("Can't execute crash reporter"); if (kill(getppid(), SIGKILL) != 0) { perror("Can't kill parent process"); } exit(EXIT_FAILURE); } } else { while(1) {} } } int main(int argc, char *argv[]) { argv0 = argv[0]; signal(SIGBUS, signal_caught); signal(SIGSEGV, signal_caught); printf("Crashing now\n"); *(int*)NULL = 3; printf("WTF? No crash!\n"); return EXIT_SUCCESS; }