Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _GNU_SOURCE
- #include <stdio.h>
- #include <execinfo.h>
- #include <inttypes.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/signal.h>
- #include <unistd.h>
- #include <limits.h>
- #include <errno.h>
- static struct sigaction sigsegv_act;
- void
- my_sigsegv_handler(int signum, siginfo_t *info, void *f)
- {
- void* buf[4096];
- int size;
- char **strs;
- printf("bad address %p\n", info->si_addr);
- size = backtrace(buf, 4096);
- printf("backtrace(%d):\n", size);
- strs = backtrace_symbols(buf, size);
- if (strs) {
- int i;
- for (i = 0; i<size; ++i) {
- char cmd[PATH_MAX];
- FILE *p;
- sprintf(cmd, "addr2line -pif -e %s %p",
- program_invocation_name, buf[i]);
- p = popen(cmd, "r");
- if (p) {
- char res[PATH_MAX];
- fgets(res, sizeof(res), p);
- pclose(p);
- printf(" %s: %s", strs[i], res);
- } else {
- printf(" %s\n", strs[i]);
- }
- }
- } else {
- printf("error in bactrace_symbols()\n");
- }
- free(strs);
- exit(1);
- }
- void
- init_sigsegv_hook()
- {
- memset(&sigsegv_act, 0, sizeof(sigsegv_act));
- sigsegv_act.sa_sigaction = my_sigsegv_handler;
- sigsegv_act.sa_flags = SA_SIGINFO;
- sigaction(SIGSEGV, &sigsegv_act, NULL);
- }
- int
- main()
- {
- init_sigsegv_hook();
- kill(getpid(), SIGSEGV);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement