Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost stacktrace异步信号安全吗?_C++_Linux_Boost - Fatal编程技术网

C++ Boost stacktrace异步信号安全吗?

C++ Boost stacktrace异步信号安全吗?,c++,linux,boost,C++,Linux,Boost,Boost提供了一种可以用来获取回溯的方法。这通常适用于非信号处理上下文,如异常、错误等 但是从信号处理程序调用安全吗?i、 例如,它不做任何异步信号不安全的活动?该示例确实从信号处理程序使用它,这可能意味着它是安全的。但是我在它的文档中找不到关于的任何内容。有: 警告 编写信号处理程序需要高度关注!信号处理程序中只允许几个系统调用,因此没有跨平台的方式来打印stacktrace而不存在死锁风险。处理此问题的唯一方法是将原始stacktrace转储到文件/套接字中,并在程序重新启动时解析它 警告

Boost提供了一种可以用来获取回溯的方法。这通常适用于非信号处理上下文,如异常、错误等

但是从信号处理程序调用安全吗?i、 例如,它不做任何异步信号不安全的活动?该示例确实从信号处理程序使用它,这可能意味着它是安全的。但是我在它的文档中找不到关于的任何内容。

有:

警告 编写信号处理程序需要高度关注!信号处理程序中只允许几个系统调用,因此没有跨平台的方式来打印stacktrace而不存在死锁风险。处理此问题的唯一方法是将原始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);
  }
}