【问题标题】:Async safe writing functions for Signal handler on windowsWindows 上 Signal 处理程序的异步安全写入函数
【发布时间】:2018-11-29 18:53:59
【问题描述】:

我正在尝试编写一个信号处理程序,当我的程序崩溃时每次都会调用它,然后将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;
    }
  }

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

【问题讨论】:

    标签: c++ visual-studio boost signals


    【解决方案1】:

    一般来说,这方面的权威信息很少,即使在 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);
    }
    

    【讨论】:

    • 首先谢谢你(再次)我要去看看signal_set。是的,我知道 boost 包含 `boost::stacktrace::safe_dump_to("")` 我自己在教程中工作,问题是safe_dump_to() 已停用,不应该在 Windows 上使用,因为它崩溃了。 异步安全转储到 Windows 操作系统上的文件导致某些平台上的挂起,现在已禁用 #33。鼓励用户更新到最新的 Boost 版本。 来自 1.67.0 补丁说明。如果这能正常工作,我会很高兴哈哈:D
    • @alovaros 我会看看signal_set。也许您可以只使用条件变量,具体取决于您的程序。此外,也许您可​​以与一些可能符合您要求的......更“成熟”(阅读:旧)库进行比较......stackoverflow.com/questions/691719/…我不能说我在那里有很多经验,所以:祝你好运!跨度>
    • 好的,再次非常感谢你:) 我希望能尽快完成这个项目。将通过替代方案阅读我(哈哈,甚至 c++11 也有这样的功能......)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 2016-03-31
    • 2018-11-16
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多