2012-11-14 43 views
0

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

我的配置

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

這裏是我的代碼有

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::exception,其what()返回無意義的「std :: exception」。

在拼命想找出什麼是錯的我輸出typeid(ex).name()這說明

N5boost16exception_detail10clone_implINS0_19error_info_injectorISt9exception 

根據谷歌這意味着:boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::exception> >

任何想法有什麼不對?

回答

1

經過50分鐘的猜測,我發現問題出在length字段。該文檔不說,但它的默認值必須是-1在源代碼中陳述

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

我直覺認爲,假如我new_file_size要大於零,將忽略length

1

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

+0

謝謝你的提示!我在Visual Studio中開發時並不十分熟悉Linux工具。 – expert