gpt4 book ai didi

c++ - Windows 上信号处理程序的异步安全写入函数

转载 作者:搜寻专家 更新时间:2023-10-31 02:06:01 25 4
gpt4 key购买 nike

我正在尝试编写一个信号处理程序,当我的程序崩溃时每次都会调用它,而不是将信息写入 boost::stacktracer api 将我放入硬盘驱动器上的一个文件中。编写处理程序是没有问题的,而使我的程序崩溃则不是。但现在我完全不确定我可以在我的处理程序中使用哪些功能。我要使用的函数需要异步安全 我明白了,但我找不到允许使用的窗口列表 我得到了 Linux 的列表这很清楚也很容易理解但没用,因为大多数功能来自 <unistd.h>这在 Windows 中不存在,或者至少在 VS2017s 编译器中不存在。自从我读到<io.h><unistd.h> 非常相似我试图通过此 header 中的功能实现我的目标。

所以我使用_sopen_s(&fileHandle,"E:\\UslessStuff\\stacktracer.txt",_O_RDWR,_SH_DENYNO,_S_IWRITE);

打开一个文件

  if(_write(fileHandle,&boost::stacktrace::stacktrace(),boost::stacktrace::stacktrace().size())==-1) {
switch(errno) {
case EBADF:
perror("Bad File Discription");
break;
case ENOSPC:
perror("No Space left on Device");
break;
case EINVAL:
perror("Invalid Parameter: Buffer was NULL");
break;
default:
perror("Unexpectet Error");


break;
}
}

用于写作。所以我不想可以使用这个功能吗?另外,我可以在信号中使用字符串多远?如您所见,我尝试从 boost::stacktrace::stacktrace() 获取信息当我将它与 cout << boost::stacktrace::stacktrace() 一起使用时,它给了我一个完美的结果但是当我尝试像上面显示的那样写它时,我的文本文件中只写了 2 个 RAM 地址,所以我想我可能需要从 boost::stacktrace::stacktrace()提取字符串创建 boost::stacktrace::frame fr这将导致 fr.source_file().c_str();所以它会给我一个 std::string我可能需要将其打包在 char* 中听起来我不应该在 Signal 中这样做

最佳答案

一般来说,这方面的权威信息很少,即使是在 POSIX 上也是如此。相反,我建议从异步处理程序内部(使用安全原语)发布到队列/发出条件信号,然后在其他地方完成其余的工作。

TTBOMK 这个抽象已经存在并且可以在 Boost 中使用:

此外,对于您的特定目的,Boost Stacktrace 确实具有明确异步安全的辅助函数:Handling terminates, aborts and Segmentation Faults :

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

关于c++ - Windows 上信号处理程序的异步安全写入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951614/

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