boost :: iostreams :: mapped_file_sink抛出未知异常

时间:2012-11-14 23:27:18

标签: c++ linux exception boost memory-mapped-files

你们可以帮我解决boost::iostreams::mapped_file_sink引发的未知异常吗?

我的配置

  • 提升1.51
  • Windows 7上的Visual Studio 2012
  • UCCntu上的GCC 4.7

这是我的代码

try
{
    boost::iostreams::mapped_file_params params_;
    boost::iostreams::mapped_file_sink sink_;
    params_.length = 0;
    params_.new_file_size = 1024;
    params_.path = "./test.bin";
    sink_.open(params_);
    sink_.close();
}
catch (std::ios::failure& ex)
{
    std::cout << "\t" << "what: " << ex.what() << "\n";
}
catch (std::system_error& ex)
{
    std::cout << "\t" << "code: " << ex.code() << "  what: " << ex.what() << "\n";
}
catch (std::runtime_error& ex)
{
    std::cout << "\t" << ex.what() << "\n";
}
catch (boost::archive::archive_exception& ex)
{
    std::cout << "\t" << ex.what() << "\n";
}
catch (boost::exception& ex)
{
    std::cout << "blah\n";
}
catch (std::exception& ex)
{
    std::cout << "\t" << ex.what() << " --- " << typeid(ex).name() << "\n";
}

它始终适用于Windows。

在Ubuntu中,它会创建给定大小的空文件,但会在open()上抛出异常。后续执行代码 if 不会导致异常。

最糟糕的是我无法看到异常的原因。我只能抓住std::exception what()返回毫无意义的“std :: exception”。

在绝望的尝试中找出错误,我输出显示

typeid(ex).name()
N5boost16exception_detail10clone_implINS0_19error_info_injectorISt9exception

根据Google的含义:boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::exception> >

任何想法有什么不对?

2 个答案:

答案 0 :(得分:1)

您可以在调试器中运行代码,并在函数中设置一个实际抛出异常的断点,例如__cxa_throw。系统的名称可能与您的系统不同:使用nm -po program | less并搜索包含throw的函数。在一个(或多个)中设置一个断点,看起来很可能就像它们是由系统创建的。如果抛出的异常很少,您还可以将断点设置为std::exception::exception()

答案 1 :(得分:1)

经过50分钟的猜测,我发现问题出现在length字段中。文档没有说明,但其默认值必须为-1,如源代码

中所述
BOOST_STATIC_CONSTANT(size_type, max_length = static_cast<size_type>(-1));

我直觉地假设如果我将new_file_size设置为大于零,则会忽略length