C++ Boost stacktrace异步信号安全吗?
Boost提供了一种可以用来获取回溯的方法。这通常适用于非信号处理上下文,如异常、错误等 但是从信号处理程序调用安全吗?i、 例如,它不做任何异步信号不安全的活动?该示例确实从信号处理程序使用它,这可能意味着它是安全的。但是我在它的文档中找不到关于的任何内容。有: 警告 编写信号处理程序需要高度关注!信号处理程序中只允许几个系统调用,因此没有跨平台的方式来打印stacktrace而不存在死锁风险。处理此问题的唯一方法是将原始stacktrace转储到文件/套接字中,并在程序重新启动时解析它 警告 并非所有平台都提供了以异步信号安全方式获取stacktrace的方法。此类平台上不会保存堆栈跟踪 紧接着:C++ Boost stacktrace异步信号安全吗?,c++,linux,boost,C++,Linux,Boost,Boost提供了一种可以用来获取回溯的方法。这通常适用于非信号处理上下文,如异常、错误等 但是从信号处理程序调用安全吗?i、 例如,它不做任何异步信号不安全的活动?该示例确实从信号处理程序使用它,这可能意味着它是安全的。但是我在它的文档中找不到关于的任何内容。有: 警告 编写信号处理程序需要高度关注!信号处理程序中只允许几个系统调用,因此没有跨平台的方式来打印stacktrace而不存在死锁风险。处理此问题的唯一方法是将原始stacktrace转储到文件/套接字中,并在程序重新启动时解析它 警告
#include <signal.h> // ::signal, ::raise
#include <boost/stacktrace.hpp>
void my_signal_handler(int signum) {
::signal(signum, SIG_DFL);
boost::stacktrace::safe_dump_to("./backtrace.dump");
::raise(SIGABRT);
}
是的,它是 正如所述,boost库中提供的用于转储回溯的函数是
boost::stacktrace::safe\u dump\u to
而
safe\u dump\u to
清楚地说明了Async Handler Safety:safe
与我的说法相反,boost-backtace API的异步信号安全性有很好的文档记录,尽管在标题和主文档页以外的其他位置。谢谢你的链接。Boost的回溯API的异步信号安全性没有肯定或否定的答案,因为它取决于特定的API-它们中的大多数是安全的,而其他的则不是。我认为它们中的大多数是不安全的,除了安全的
-函数系列,这些函数都被记录为
namespace boost {
namespace stacktrace {
std::size_t safe_dump_to(void *, std::size_t);
std::size_t safe_dump_to(std::size_t, void *, std::size_t);
std::size_t safe_dump_to(const char *);
std::size_t safe_dump_to(std::size_t, std::size_t, const char *);
std::size_t safe_dump_to(platform_specific_descriptor);
std::size_t safe_dump_to(std::size_t, std::size_t,
platform_specific_descriptor);
}
}