【问题标题】:Why does boost::process crash on Windows when stderr is redirected to a pipe?当 stderr 被重定向到管道时,为什么 boost::process 在 Windows 上崩溃?
【发布时间】:2017-11-29 13:57:48
【问题描述】:

此代码基于boost::process 1.65.1 示例,修复了一些拼写错误:

#include <boost/process.hpp>

int main(int argc, char *argv[])
{
    boost::asio::io_service ios;
    std::future<std::vector<char>> output, error;
    boost::process::child c("hostname.exe",
        boost::process::std_out > output,
        boost::process::std_err > boost::process::null,
        ios);
    ios.run();
    c.wait();
    if (output.valid())
    {
        auto processOutput = output.get();
        processOutput.push_back('\0');
        printf(processOutput.data());
    }
    if (error.valid())
    {
        auto processError = error.get();
        processError.push_back('\0');
        printf(processError.data());
    }
    return 0;
}

它按预期工作。它运行hostname.exe 并打印其输出,即。 e.您的计算机网络名称。

您可能会看到 error 变量未使用。读stderr也是合乎逻辑的,即使hostname.exe通常不使用它,现实的子进程当然可以使用它。将boost::process::std_err &gt; boost::process::null 替换为boost::process::std_err &gt; error 看起来很简单。但是,它会导致崩溃。错误信息如下:

vector iterator not dereferencable

有谁知道原因以及如何绕过这个错误?

【问题讨论】:

  • 我实际上已经找到了修复。修复需要编辑 boost hpp 文件之一。这是boost bug,希望官方尽快修复。

标签: c++ windows boost


【解决方案1】:

这是 Boost Process 中的一个错误。崩溃出现在include\boost\process\detail\windows\async_out.hpp 导致崩溃的代码如下:

arg.resize(buffer->size());
is.read(&*arg.begin(), buffer->size());

重定向std_err 还是std_out 并不重要。当流不生成任何输出时会出现问题。对于hostname.exe,它是std_err,但是,如果您尝试运行pyw.exe,您也会收到std_out 的此错误。

当 progam 没有输出时,buffer-&gt;size() 返回 0,因此向量变为空向量。看起来尝试取消引用空向量会导致 Visual C++ 崩溃(调试断言)。

修复如下:

auto bufferSize = buffer->size();
if (bufferSize) {
    arg.resize(buffer->size());
    is.read(&*arg.begin(), buffer->size());
}

我没有提交这个错误报告来提升,如果有人有时间,让他去做。

【讨论】:

猜你喜欢
  • 2010-09-16
  • 2020-09-26
  • 2019-06-08
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多