Boost stacktrace异步信号安全吗?

时间:2019-08-07 09:29:31

标签: c++ linux boost

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

但是从信号处理程序中调用安全吗?即,它没有进行任何异步信号不安全的活动?该示例确实从信号处理程序中使用了它,这可能意味着它是安全的。但是我在其文档中找不到关于async-signal-safety的任何信息。

2 个答案:

答案 0 :(得分:1)

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

  

警告   编写信号处理程序需要高度重视!信号处理程序中仅允许几个系统调用,因此没有跨平台的方式来打印堆栈跟踪信息而不会造成死锁。解决该问题的唯一方法-将原始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);
}

它还包含用法示例以及如何进行启动检查

标题摘要: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);
  }
}

答案 1 :(得分:1)

是的,是

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

safe_dump_todocumentation 明确指出 Async-Handler-Safety: Safe