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

GMi*_*ael 6 c++ linux 64-bit signals stack-trace

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

Jam*_*nze 1

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

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