如何为 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 上工作)。不幸的是,这些新驱动程序确实存在问题...
美好的一天,我正在尝试调试与 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 上工作)。不幸的是,这些新驱动程序确实存在问题...