簡體   English   中英

boost :: iostreams :: mapped_file_sink拋出未知異常

[英]boost::iostreams::mapped_file_sink throws unknown exception

你能幫我解決由boost::iostreams::mapped_file_sink拋出的decypher未知異常嗎?

我的配置

  • 提升1.51
  • Windows 7上的Visual Studio 2012
  • 關於Ubuntu的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()上拋出異常。 如果存在,則后續執行代碼不會導致異常。

最糟糕的是我無法看到異常的原因。 我只能捕獲std::exceptionwhat()返回無意義的“std :: exception”。

在絕望的嘗試找出什么是錯的我輸出顯示的typeid(ex).name()

N5boost16exception_detail10clone_implINS0_19error_info_injectorISt9exception

根據谷歌的意思: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::exception> >

有什么想法有什么不對嗎?

您可以在調試器中運行代碼並在函數中設置斷點,該斷點實際上會拋出異常,例如__cxa_throw 您的系統上的功能名稱可能有所不同:使用nm -po program | less nm -po program | less並搜索包含throw的函數。 在一個(或多個)中設置一個斷點,看起來很可能就像它們是由系統創建的。 如果拋出的異常很少,您還可以將斷點設置為std::exception::exception()

經過50分鍾的猜測,我發現問題出現在length領域。 文檔沒有說明,但其默認值必須為-1,如源代碼中所述

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

我直觀地假設如果我將new_file_size設置為大於零,則會忽略length

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM