Windows上信号处理程序的异步安全写入功能

时间:2018-06-20 15:15:03

标签: c++ visual-studio boost signals

我正在尝试编写一个信号处理程序,该信号处理程序在程序崩溃时每次都会调用,而不是将boost::stacktracer api给我的信息写入硬盘中的文件中。 编写处理程序是没有问题的,并且使程序崩溃也不是没有问题。 但是现在我完全不确定 可以在处理程序中使用哪些功能。 我要使用的功能必须是异步安全的,但我只是找不到允许使用 功能的窗口的列表,而我却得到了Linux的列表这很清楚,也很容易理解,但是没用,因为大多数函数来自<unistd.h>,并且在Windows或VS2017s编译器中都不存在。 自从我读到<io.h><unistd.h>以来,我就尝试使用此标头中的函数来实现自己的目标。

所以我用_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();,因此我会给我一个{{1} },我可能需要将其包装在std::string中,这听起来确实像我不应该在Signal中这样做

1 个答案:

答案 0 :(得分:2)

总体上,即使在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);
}
相关问题