Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.31 KB | None | 0 0
  1. #define _GNU_SOURCE
  2.  
  3. #include <stdio.h>
  4. #include <execinfo.h>
  5. #include <inttypes.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <sys/types.h>
  10. #include <sys/signal.h>
  11. #include <unistd.h>
  12. #include <limits.h>
  13. #include <errno.h>
  14.  
  15. static struct sigaction sigsegv_act;
  16.  
  17. void
  18. my_sigsegv_handler(int signum, siginfo_t *info, void *f)
  19. {
  20.     void* buf[4096];
  21.     int size;
  22.     char **strs;
  23.  
  24.     printf("bad address %p\n", info->si_addr);
  25.  
  26.     size = backtrace(buf, 4096);
  27.     printf("backtrace(%d):\n", size);
  28.  
  29.     strs = backtrace_symbols(buf, size);
  30.     if (strs) {
  31.         int i;
  32.         for (i = 0; i<size; ++i) {
  33.             char cmd[PATH_MAX];
  34.             FILE *p;
  35.  
  36.             sprintf(cmd, "addr2line -pif -e %s %p",
  37.                 program_invocation_name, buf[i]);
  38.             p = popen(cmd, "r");
  39.             if (p) {
  40.                 char res[PATH_MAX];
  41.                 fgets(res, sizeof(res), p);
  42.                 pclose(p);
  43.                 printf(" %s: %s", strs[i], res);
  44.             } else {
  45.                 printf(" %s\n", strs[i]);
  46.             }
  47.         }
  48.     } else {
  49.         printf("error in bactrace_symbols()\n");
  50.     }
  51.     free(strs);
  52.     exit(1);
  53. }
  54.  
  55. void
  56. init_sigsegv_hook()
  57. {
  58.     memset(&sigsegv_act, 0, sizeof(sigsegv_act));
  59.     sigsegv_act.sa_sigaction = my_sigsegv_handler;
  60.     sigsegv_act.sa_flags = SA_SIGINFO;
  61.     sigaction(SIGSEGV, &sigsegv_act, NULL);
  62. }
  63.  
  64. int
  65. main()
  66. {
  67.     init_sigsegv_hook();
  68.     kill(getpid(), SIGSEGV);
  69.     return 0;
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement