Boost具有boost::stacktrace::stacktrace(),可用于获取回溯。通常在异常,错误等非信号处理上下文中很有用。
但是从信号处理程序中调用安全吗?即,它没有进行任何异步信号不安全的活动?该示例确实从信号处理程序中使用了它,这可能意味着它是安全的。但是我在其文档中找不到关于async-signal-safety的任何信息。
答案 0 :(得分:1)
警告 编写信号处理程序需要高度重视!信号处理程序中仅允许几个系统调用,因此没有跨平台的方式来打印堆栈跟踪信息而不会造成死锁。解决该问题的唯一方法-将原始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);
}
它还包含用法示例以及如何进行启动检查
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);
}
}
答案 1 :(得分:1)
是的,是。
因为,boost 库中提供的用于转储回溯的函数是 boost::stacktrace::safe_dump_to
。
而 safe_dump_to
的 documentation 明确指出 Async-Handler-Safety: Safe