有一个在Linux上运行的多线程应用程序,CPU架构是x86_64。我希望能够像backtrace()函数那样获得堆栈跟踪。信号处理程序返回后,应用程序将继续运行。这是SIGUSR1处理程序。
backtrace()被认为不是信号安全的,我无法说服自己在这种情况下可以从信号处理程序中使用它。
我看到一些注释说LLVM libwind是信号安全的,尽管没有在库文档中找到这样的语句。
那么从信号处理程序中使用libunwind是安全的吗?如果是,为什么?
如果没有,还有其他选择吗?
只要您在本地展开(即从您正在获取调用堆栈的进程),反向跟踪是信号安全的。来自libunwind的文档:
每个libunwind例程的手册页标识是否它是信号安全的,但作为一般规则,任何例程都可能是本地unwind所需的是信号安全的(例如,local的unw_step())unwind是信号安全的)。对于远程展开,没有任何束流例程保证是信号安全的。