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

c– 从信号处理程序打印堆栈跟踪,第1张

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

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

#define SIZE 100voID 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 – 从信号处理程序打印堆栈跟踪全部内容,希望文章能够帮你解决c – 从信号处理程序打印堆栈跟踪所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1258706.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存