0

スローされた未知の例外を解読するのを手伝ってくれませんboost::iostreams::mapped_file_sinkか?

私の構成

  • 1.51ブースト
  • Windows7上のVisualStudio2012
  • Ubuntu上のGCC4.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::exception」std::exceptionが返されるものしかキャッチできません。what()

何が悪いのかを必死に調べて、次のように出力typeid(ex).name()します。

N5boost16exception_detail10clone_implINS0_19error_info_injectorISt9exception

グーグルによると、これは次のことを意味します:boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::exception> >

何が問題なのですか?

4

2 に答える 2

1

デバッガーでコードを実行し、関数にブレークポイントを設定して、実際に例外をスローすることができます__cxa_throw。関数の名前はシステムによって異なる場合があります。nm -po program | lessを含む関数を使用して検索しますthrow。システムによって作成されたように見えるブレークポイントにブレークポイントを設定します。スローされる例外が少ない場合は、ブレークポイントをに設定することもできますstd::exception::exception()

于 2012-11-14T23:51:49.123 に答える
1

length50分の推測の後、問題が現場にあることがわかりました。ドキュメントにはそのようには書かれていませんが、ソースコードに記載されているようにデフォルト値は-1でなければなりません

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

new_file_sizeゼロより大きく設定すると、無視されると直感的に思いlengthました。

于 2012-11-15T00:23:41.147 に答える