1

boost::asioリモートマシンに接続し、受信したものを繰り返し印刷するプログラムがあります。問題は、実行中に一時停止したり、ブレークポイントを変更したりするたびに、 内のどこかから例外がスローされることread_until()です。なぜこれが起こるのですか?どうすればよいですか?

これは、Xcode 4.4.1 および Apple clang 4.0 を搭載した OS X 10.8.2 を実行している Mac 上にあります。プログラムを一時停止した後に例外がスローされたときのスタック トレース:

* thread #1: tid = 0x1d07, 0x00007fff86bc9d46 libsystem_kernel.dylib`__kill + 10, stop reason = signal SIGABRT
    frame #0: 0x00007fff86bc9d46 libsystem_kernel.dylib`__kill + 10
    frame #1: 0x00007fff8ec40df0 libsystem_c.dylib`abort + 177
    frame #2: 0x00007fff8c49ca17 libc++abi.dylib`abort_message + 257
    frame #3: 0x00007fff8c49a3c6 libc++abi.dylib`default_terminate() + 28
    frame #4: 0x00007fff8d05e887 libobjc.A.dylib`_objc_terminate() + 111
    frame #5: 0x00007fff8c49a3f5 libc++abi.dylib`safe_handler_caller(void (*)()) + 8
    frame #6: 0x00007fff8c49a450 libc++abi.dylib`std::terminate() + 16
    frame #7: 0x00007fff8c49b5b7 libc++abi.dylib`__cxa_throw + 111
    frame #8: 0x00000001000043df test`void boost::throw_exception<boost::system::system_error>(boost::system::system_error const&) + 111 at throw_exception.hpp:66
    frame #9: 0x0000000100004304 test`boost::asio::detail::do_throw_error(boost::system::error_code const&, char const*) + 68 at throw_error.ipp:38
    frame #10: 0x0000000100004272 test`boost::asio::detail::throw_error(boost::system::error_code const&, char const*) + 50 at throw_error.hpp:42
    frame #11: 0x0000000100002479 test`unsigned long boost::asio::read_until<boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > >, std::allocator<char> >(boost::asio::ssl::stream<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > >&, boost::asio::basic_streambuf<std::allocator<char> >&, std::string const&) + 73 at read_until.hpp:98
    frame #12: 0x00000001000012c5 test`main + 581 at main.cpp:21
    frame #13: 0x00007fff8983e7e1 libdyld.dylib`start + 1
4

2 に答える 2

3

プログラムを一時停止するとき、実際の一時停止は、POSIX シグナル ( SIGSTOP) を送信することによって行われます。この影響の 1 つは、システム コール ( read()Boost が内部で使用する など) がエラーを返すことEINTRです。これにより、 のエラー処理コードがトリガーread_untilされ、ご覧のとおり、例外がスローされます。

これを適切に処理したい場合は、パラメーターを受け取るオーバーロードを使用し、( で定義されている)に対してboost::system::error_codeチェックし、読み取りを再試行することをお勧めします。.value()EINTRerrno.h

これは次のようになります

boost::system::error_code error;
boost::asio::streambuf message;
do {
    boost::asio::read(socket, message, boost::asio::transfer_exactly(body_size), error);
} while (error.value() == EINTR);
于 2013-01-11T07:42:24.797 に答える
2

read_until()エラー時に例外をスローするオーバーライドがあり、これをキャッチしていない場合は、この動作が表示されます。boost::asioを取り込まないオーバーライドを使用している場合はboost::system::error_code&、安全のために、これらの呼び出しをtryをキャッチするブロックでラップする必要がありconst boost::system::error_code&ます。例外ハンドラーでは、例外を調べて、失敗の根本原因を確認する必要があります。

try
{
   boost::asio::read_until(...);
}

catch(const boost::system::error_code& err)
{
   // read_until(...) failed, the reason is
   // contained in err
}
于 2012-10-03T14:22:21.177 に答える