Boost 堆栈跟踪异步信号安全吗?

Is Boost stacktrace async signal safe?

本文关键字:安全 信号 异步 堆栈 跟踪 Boost      更新时间:2023-10-16

Boost 有 boost::stacktrace::stacktrace(( 可用于获取回溯。这通常在非信号处理上下文(如异常、错误等(中很有用。

但是从信号处理程序调用是否安全?即,它不执行任何异步信号不安全的活动?该示例确实从信号处理程序中使用它,这可能意味着它是安全的。但是我在其文档中找不到有关异步信号安全的任何内容。

https://www.boost.org/doc/libs/1_70_0/doc/html/stacktrace/getting_started.html#stacktrace.getting_started.handle_terminates_aborts_and_seg 有:

警告编写信号处理程序需要高度关注!信号处理程序中只允许少量系统调用,因此没有跨平台的方式来打印堆栈跟踪,而不会有死锁的风险。解决问题的唯一方法 - 将原始堆栈跟踪转储到文件/套接字中,并在程序重新启动时解析它。

警告并非所有平台都提供以异步信号安全方式获取堆栈跟踪的方法。此类平台上不会保存任何堆栈跟踪。

紧接着是:

#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);
}

它继续提供使用示例,以及如何进行启动检查

标题概要:https://www.boost.org/doc/libs/1_70_0/doc/html/stacktrace/reference.html#header.boost.stacktrace.safe_dump_to_hpp

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);
}
}

是的,是的

因为,boost库中提供的用于转储回溯的功能是boost::stacktrace::safe_dump_to

safe_dump_to的文件清楚地说明了Async-Handler-Safety: Safe