首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从信号处理程序打印堆栈跟踪

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

Stack Overflow用户
提问于 2012-02-09 16:38:24
回答 2查看 4.9K关注 0票数 6

我需要从运行在Linux上的64位多线程C++应用程序的信号处理程序中打印堆栈跟踪。虽然我找到了几个代码示例,但它们都不能编译。我的阻塞点是从ucontext_t结构中获取调用者的地址(信号的生成点)。我能找到的所有信息都指向企业信息门户注册表ucontext.gregsREG_EIP或ucontext.eip。看起来它们都是特定于x86的。我需要英特尔和AMD CPU的64位兼容代码。有人能帮上忙吗?

EN

回答 2

Stack Overflow用户

发布于 2012-02-15 04:44:26

有一个glibc函数回溯。手册页列出了调用的示例:

代码语言:javascript
运行
复制
#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时,可能会调用信号处理程序。

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

票数 4
EN

Stack Overflow用户

发布于 2012-02-09 17:27:56

获取堆栈跟踪的通常方法是获取局部变量的地址,然后根据编译器生成代码的方式(这可能取决于用于编译代码的优化选项)向其添加一些幻数,然后从那里返回。所有这些都非常依赖于系统,但如果你知道自己在做什么,这是可行的。

这在信号处理程序中是否有效则是另一个问题。我不知道你所描述的平台,但是很多系统为信号处理程序安装了一个单独的堆栈,没有链接回用户可访问内存中被中断的堆栈。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9207599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档