Linux_打印函数调用栈

6287阅读 0评论2011-02-11 matthew_1983
分类:LINUX

Linux_打印函数调用栈
方法一:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <execinfo.h>
  4. /* Obtain a backtrace and print it to stdout. */
  5. void
  6. print_trace (void)
  7. {
  8. void *array[10];
  9. size_t size;
  10. char **strings;
  11. size_t i;

  12. size = backtrace (array, 10);
  13. strings = backtrace_symbols (array, size);

  14. printf ("Obtained %zd stack frames.\n", size);

  15. for (i = 0; i < size; i++)
  16. printf ("%s\n", strings);

  17. free (strings);
  18. }

  19. int main()
  20. {
  21. print_trace ();
  22. }
编译:g++ stack.c -g -o stack -rdynamic
 
方法二:
  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <execinfo.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. void backtrace()
  7. {
  8.         const int maxLevel = 200;
  9.         void* buffer[maxLevel];
  10.         int level = backtrace(buffer, maxLevel);
  11.         const int SIZE = 1024;
  12.         char cmd[SIZE] = "addr2line -C -f -e ";

  13.         // let prog point to the end of "cmd"

  14.         char* prog = cmd + strlen(cmd);

  15.         int r = readlink("/proc/self/exe", prog, sizeof(cmd) - (prog-cmd)-1);

  16.         FILE* fp = popen(cmd, "w");
  17.         if (!fp)
  18.         {
  19.                 perror("popen");
  20.                 return;
  21.         }
  22.         for (int i = 0; i < level; ++i)
  23.         {
  24.                 fprintf(fp, "%p\n", buffer[i]);
  25.         }

  26.         fclose(fp);
  27. }
  28. void foo(int, char*)
  29. {
  30.         backtrace();
  31. }
  32. void bar(double)
  33. {
  34.         foo(0, NULL);
  35. }

  36. int main()
  37. {
  38.         bar(0.0);
  39.         //A a;

  40.         return 0;
  41. }
编译:g++ stack1.c -g -o stack1 -rdynamic
 
 
上一篇:没有了
下一篇:C++中new和malloc的区别