linux 从信号处理程序调用llvm-libunwind安全吗?

umuewwlo  于 2023-04-11  发布在  Linux
关注(0)|答案(1)|浏览(112)

有一个在Linux上运行的多线程应用程序,CPU架构是x86_64。我希望能够像backtrace()函数那样获得堆栈跟踪。信号处理程序返回后,应用程序将继续运行。这是SIGUSR1处理程序。
backtrace()被认为不是信号安全的,我不能说服自己在这种情况下可以从信号处理程序中使用它。
我看到一些评论说LLVM libunwind是信号安全的,尽管在库文档中没有找到这样的声明。
那么从信号处理程序使用libunwind安全吗?如果是,为什么?
如果没有,还有其他选择吗?

mec1mxoz

mec1mxoz1#

只要你是在本地展开(即从你正在获取的调用堆栈的进程),回溯是信号安全的。从libunwind的文档:
每个libunwind例程的手册页标识它是否是信号安全的,但作为一般规则,本地展开可能需要的任何例程都是信号安全的(例如,用于本地展开的unw_step()是信号安全的)。对于远程展开,没有一个libunwind例程保证是信号安全的。

相关问题