Boost 堆栈跟踪异步信号安全吗?
Is Boost stacktrace async signal safe?
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
- 从不同线程使用int64的不同字节安全吗
- Qt VTK交互风格的信号到小部件
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 从另一个线程发出信号是否安全?
- 窗口上信号处理程序的异步安全写入函数
- Boost 堆栈跟踪异步信号安全吗?
- 在QT中,从CloseEvent函数发出信号是安全的
- 在传递的对象即将被销毁之前,发出将QObject指针作为参数传递的信号是否安全
- Qt信号槽在线程上,这是安全的方式吗?
- 增强信号2破坏安全
- 信号处理程序异步安全函数
- SIGRTMIN和SIGRTMAX在信号处理程序中使用安全吗?
- 如何使一个函数异步信号安全
- 是std::原子信号安全的
- 在信号处理程序中使用' std::shared_ptr '和' std::weak_ptr '是否安全?
- Qt信号和插槽线程安全