Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1950118
  • 博文数量: 77
  • 博客积分: 2175
  • 博客等级: 大尉
  • 技术积分: 2491
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-20 20:49
个人简介

欢迎光临我的博客

文章分类

全部博文(77)

文章存档

2023年(1)

2018年(4)

2017年(1)

2016年(2)

2015年(2)

2013年(5)

2012年(29)

2010年(33)

分类: LINUX

2012-02-13 15:46:06

主要使用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下如何在程序中获得当前调用栈信息
阅读(17226) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~