c – 从信号处理程序打印堆栈跟踪

我需要从Linux上运行的64位多线程C应用程序的信号处理程序打印堆栈跟踪.虽然我找到了几个代码示例,但它们都没有编译.我的阻塞点是从ucontext_t结构获取调用者(生成信号的点)地址.我能找到的所有信息都指向EIP寄存器为ucontext.gregs [REG_EIP]或ucontext.eip.看起来它们都是x86特有的.我需要适用于Intel和AMD cpu的64位兼容代码.有人可以帮忙吗?

最佳答案
一个glibc函数回溯.手册页列出了调用的示例:

#define SIZE 100
void myfunc3(void) {
       int j,nptrs;

       void *buffer[100];
       char **strings;

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

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

       strings = backtrace_symbols(buffer,nptrs);
       if (strings == NULL) {
           perror("backtrace_symbols");
           exit(EXIT_FAILURE);
       }

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

       free(strings);
   }

有关更多上下文,请参见手册页.

很难说这是否真的可以保证从信号处理程序中起作用,因为posix只列出了几个可以保证工作的重入函数.请记住:当您的进程的其余部分正好在malloc调用的中间时,可以调用信号处理程序.

我的猜测是,这通常有效,但可能会不时失败.对于调试,这可能已经足够了.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...