如何为 C++ std::ofstream 写入设备获取更多调试信息?

How to get more debug info for C++ std::ofstream writing to device?

美好的一天,我正在尝试调试与 XDMA 设备交互的 C++ 代码:

#include <fstream>
#include <iostream>
#include <unistd.h>

int main()
{
    std::ofstream output_;
    const char* output_name = "/dev/xdma/card0/h2c0";

    output_.exceptions(std::ios::failbit | std::ios::badbit);
    output_.rdbuf()->pubsetbuf(nullptr, 0);
    output_.open(output_name, std::ios::binary | std::ios::out);

    std::streamoff offset = 0x1e00000;
    output_.seekp(offset, std::ios::beg);

    const char buf[1] = "";
    std::streamsize size = 1;
    auto pos = output_.tellp();

    output_.write(buf, size); // <--- IOSTREAM ERROR

    output_.seekp(pos + size, std::ios::beg);
    return 0;
}

但是这个程序在 output_.write(buf, size); 上失败了 - 错误信息相当模糊:

terminate called after throwing an instance of 'std::__ios_failure'
  what():  basic_ios::clear: iostream error
Aborted (core dumped)

而且,如果我将此 output_.write(buf, size); 包装在 try & catch 块中:

    try {
        output_.write(buf, size);
    }
    catch (std::system_error& e) {
        std::cerr << e.code().message() << "(" << e.code().value() << ")\n";
        return 1;
    }

变为iostream error(1)。这并不能说明失败的原因……我确信我可以写入 0x1e00000 偏移量,因为替代 C 代码可以完美运行。所以错误出在 C++ 代码或库中。 如何获取更多调试信息?

虽然我没有成功获取更多调试信息,但解决方案是将提供 /dev/xdma/card0/h2c0 设备的 XDMA 驱动程序从 v2017.1.47 降级到较旧的 v2017.0.45 版本(需要自定义补丁才能在新的 OS 上工作)。不幸的是,这些新驱动程序确实存在问题...