从信号处理程序调用 llvm-libunwind 是否安全?

问题描述 投票:0回答:1

有一个运行在Linux上的多线程应用程序,CPU架构是x86_64。我希望能够像 backtrace() 函数那样获得堆栈跟踪。信号处理程序返回后,应用程序将继续运行。这是 SIGUSR1 处理程序。

backtrace() 被认为不是信号安全的,我无法说服自己在这种情况下可以从信号处理程序中使用它。

我看到一些评论说 LLVM libunwind 是信号安全的,但没有找到这样的声明,例如在图书馆文档中。

那么从信号处理程序使用 libunwind 安全吗?如果是,为什么?

如果没有,还有什么其他选择?

linux x86-64 llvm backtrace libunwind
1个回答
1
投票

只要您在本地展开(即从您正在获取其调用堆栈的进程),回溯就是信号安全的。来自 libunwind 的文档

每个 libunwind 例程的手册页标识是否 它是信号安全的,但作为一般规则,任何可能 本地展开所需的是信号安全的(例如,本地的 unw_step() 展开是信号安全的)。对于远程展开,没有 libunwind 例程保证是信号安全的。

© www.soinside.com 2019 - 2024. All rights reserved.