服务器崩溃后尝试在套接字上调用 recv 时出现 SIGBUS (Android 6.0.1)

SIGBUS when trying to call recv on socket after server crash (Android 6.0.1)

我目前正在做一些应用程序稳定性测试,我 运行在调用以下方法时遇到了问题;

    vector<char> buffer( 256 ); 
    received = recv( fd, buffer.data(), buffer.size(), MSG_NOSIGNAL );

在这种情况下 fd 是一个 TCP 套接字。当调用上面的代码并且同时套接字的服务器端以一种或另一种方式关闭时,我得到以下信号;

SIGBUS (signal SIGBUS: illegal alignment)

它似乎只发生在 Android 6.0.1 上,我似乎无法 'ignore' 使用

的 SIGBUS
signal(SIGBUS, SIG_IGN)

还有其他人 运行 解决过这个问题吗?解决这个问题的最佳方法是什么?

好的,我发现问题了。它与 recv 的调用无关。当 std::exception 在 Android 6.0.1 上被抛出时会出现信号。即使它归咎于 recv 调用。这似乎是由我使用的 c++_shared STL 版本引起的。解决方案是切换到 gnustl_staticgnustl_shared