在Linux下如何在程序中获得当前调用栈信息

主要使用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下如何在程序中获得当前调用栈信息
上一篇:《返璞归真--UNIX技术内幕》--第6章 中断处理过程


下一篇:和Steve之间的通信--RE: 关于《UNIX技术内幕》的勘误及遇到的问题_4