Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2159699
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-04-11 11:19:07

1. man backtrace中的内容
1.1 函数 
#include
int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);
void backtrace_symbols_fd(void *const *buffer, int size, int fd);
1.2 代码
backtrace的man page中给出如下demo
  1. #include <execinfo.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>

  5. void myfunc3(void)
  6. {
  7.     int j, nptrs;
  8. #define SIZE 100
  9.     void *buffer[100];
  10.     char **strings;

  11.     nptrs = backtrace(buffer, SIZE);
  12.     printf("backtrace() returned %d addresses\n", nptrs);

  13.     /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
  14.        would produce similar output to the following: */

  15.     strings = backtrace_symbols(buffer, nptrs);
  16.     if (strings == NULL) {
  17.         perror("backtrace_symbols");
  18.         exit(EXIT_FAILURE);
  19.     }

  20.     for (j = 0; j < nptrs; j++)
  21.         printf("%s\n", strings[j]);

  22.     free(strings);
  23. }

  24. static void myfunc2(void)
  25. {
  26.     myfunc3();
  27. }

  28. void myfunc(int ncalls)
  29. {
  30.     if (ncalls > 1)
  31.         myfunc(ncalls - 1);
  32.     else
  33.         myfunc2();
  34. }

  35. int main(int argc, char *argv[])
  36. {
  37.     if (argc != 2) {
  38.         fprintf(stderr, "%s num-calls\n", argv[0]);
  39.         exit(EXIT_FAILURE);
  40.     }

  41.     myfunc(atoi(argv[1]));
  42.     exit(EXIT_SUCCESS);
  43. }
1.3编译
  1. cong@msi:/tmp$ gcc -g -o prog prog.c
  2. cong@msi:/tmp$ ./prog 3
  3. backtrace() returned 8 addresses
  4. ./prog() [0x4007dc]
  5. ./prog() [0x400895]
  6. ./prog() [0x4008bc]
  7. ./prog() [0x4008b5]
  8. ./prog() [0x4008b5]
  9. ./prog() [0x400917]
  10. /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f6dfdf29ec5]
  11. ./prog() [0x4006f9]
1.3.1 加入-rdynamic
  1. cong@msi:/tmp$ gcc -g -o prog prog.c -rdynamic
  2. cong@msi:/tmp$ ./prog
  3. ./prog num-calls
  4. cong@msi:/tmp$ ./prog 3
  5. backtrace() returned 8 addresses
  6. ./prog(myfunc3+0x1f) [0x400a7c]
  7. ./prog() [0x400b35]
  8. ./prog(myfunc+0x25) [0x400b5c]
  9. ./prog(myfunc+0x1e) [0x400b55]
  10. ./prog(myfunc+0x1e) [0x400b55]
  11. ./prog(main+0x59) [0x400bb7]
  12. /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7fbc840abec5]
  13. ./prog() [0x400999]
2.1 实现dump_stack
  1. #include <execinfo.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. void dump_stack()
  6. {
  7.     int i;
  8.     int size = 64;
  9.     void * array[64];
  10.     int stack_num = backtrace(array, size);
  11.     char ** stacktrace = backtrace_symbols(array, stack_num);
  12.     for (i = 0; i < stack_num; ++i)
  13.     {
  14.         printf("%s\n", stacktrace[i]);
  15.     }
  16.     free(stacktrace);
  17. }

  18. void fun3()
  19. {
  20.     dump_stack();
  21. }

  22. void fun2()
  23. {
  24.     fun3();
  25. }


  26. void fun1()
  27. {
  28.     fun2();
  29. }



  30. int main(int argc, char *argv[])
  31. {
  32.     fun1();
  33.     exit(EXIT_SUCCESS);
  34. }
2.2 编译
gcc -g -o dump dump.c -rdynamic

2.3运行结果
  1. cong@msi:/tmp$ ./dump
  2. ./dump(dump_stack+0x2c) [0x400989]
  3. ./dump(fun3+0xe) [0x400a12]
  4. ./dump(fun2+0xe) [0x400a22]
  5. ./dump(fun1+0xe) [0x400a32]
  6. ./dump(main+0x19) [0x400a4d]
  7. /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7fa3dac16ec5]
  8. ./dump() [0x400899]
./dump -->main-->fun1-->fun2-->fun3-->dump_stack



阅读(1776) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~