Chinaunix首页 | 论坛 | 博客
  • 博客访问: 169997
  • 博文数量: 25
  • 博客积分: 548
  • 博客等级: 中士
  • 技术积分: 229
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-11 18:48
文章分类

全部博文(25)

文章存档

2012年(2)

2011年(23)

分类: LINUX

2011-02-11 18:49:02

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
 
 
阅读(6211) | 评论(0) | 转发(1) |
0

上一篇:没有了

下一篇:C++中new和malloc的区别

给主人留下些什么吧!~~