Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57274
  • 博文数量: 27
  • 博客积分: 20
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-09 14:20
文章分类
文章存档

2016年(2)

2014年(20)

2013年(5)

我的朋友

分类: LINUX

2013-11-06 13:38:37

主要使用backtrace和backtrace_symbols两个函数。
  1. #include
  2. #include
  3. using namespace std;

 //返回当前堆栈调用列表

  1. string print_trace(int fd, int filter_first_lines)
  2. {
  3.     void *array[MAX_STACK_LAYERS];
  4.     size_t size;
  5.     char **strings;
  6.     size_t i;
  7.     string strRet("");
  8.     
  9.     size = backtrace (array, MAX_STACK_LAYERS);
  10.     strings = backtrace_symbols (array, size);

  11.     for (i = 0; i < size; i++)
  12.     {
  13.         if(i < filter_first_lines)
  14.             continue;
  15.         if(fd > 0)
  16.         {
  17.             write(fd, strings[i], strlen(strings[i]));
  18.             write(fd, "\n", 1);
  19.         }
  20.         strRet.append(strings[i]);
  21.         if(i < size-1)
  22.             strRet.append(1, '\n');
  23.     }
  24.     if(fd > 0)
  25.         write(fd, "\n", 1);

  26.     free (strings);
  27.     return strRet;
  28. }
一个示例输出结果是:
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z11print_tracei+0x5c) [0x81798e4]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_ZN10MemTracker16RetriveCallStackEiRSs+0x2d) [0x8179ab5]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_ZN10MemTracker9AddRecordEjPvi+0xc1) [0x817a9b7]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Znwj+0x5b) [0x817b02d]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z19IWCreateNotesThreadP17IWNotesThreadInfo+0x5b) [0x80bfc63]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z11IWNotesMainR14LNNotesSessioniPPc+0x525) [0x81624af]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(_Z6iwmainiPPc13iwmain_errors+0x83) [0x8162a01]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent(main+0x41) [0x8162b79]
/lib/libc.so.6(__libc_start_main+0xdc) [0x2e5e9c]
/opt/ibm/lotus801/lotus/notes/80010/linux/iwagent [0x806c7c1]

相关链接:
《返璞归真--UNIX技术内幕》
在Solaris下如何在程序中获得当前调用栈信息
在AIX下如何在程序中获得当前调用栈信息
在Windows下如何在程序中获得当前调用栈信息
阅读(1642) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~