gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:39 25 4
gpt4 key购买 nike

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

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

最佳答案

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

WarningWriting a signal handler requires high attention! Only a few system calls allowed in signal handlers, so there's no cross platform way to print a stacktrace without a risk of deadlocking. The only way to deal with the problem - dump raw stacktrace into file/socket and parse it on program restart.

WarningNot all the platforms provide means for even getting stacktrace in async signal safe way. No stack trace will be saved on such platforms.

紧随其后的是:

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

关于c++ - Boost 堆栈跟踪异步信号安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57391179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com