JVM 信号链 SIGPIPE
我们有一个带有嵌入式JVM(Sun)的C++应用程序。因为我们注册了自己的信号处理程序,所以建议在初始化JVM之前这样做,因为它会安装自己的处理程序(请参阅此处)。
根据我的理解,JVM在内部知道信号是否来自它自己的代码,如果不是,它沿着链传递给我们的处理程序。
我们开始看到的是,我们正在获得SIPPE,其调用堆栈看起来大致如下所示(顶部条目是我们的信号处理程序):
/.../libos_independent_utilities.so(_ZN2os32smart_synchronous_signal_handlerEiP7siginfoPv+0x9) [0x2b124f7a3989]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05dc6c]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05bffb]
/.../jvm/jre/lib/amd64/server/libjvm.so(JVM_handle_linux_signal+0x718) [0x2aaaab05e878]
/.../jvm/jre/lib/amd64/server/libjvm.so [0x2aaaab05bf0e]
/lib64/libpthread.so.0 [0x3c2140e4c0]
/lib64/libpthread.so.0(send+0x91) [0x3c2140d841]
/.../jvm/jre/lib/amd64/libnet.so [0x2aaabd360269]
/.../jvm/jre/lib/amd64/libnet.so(Java_java_net_SocketOutputStream_socketWrite0+0xee) [0x2aaabd35cf4e]
[0x2aaaaeb3bf7f]
JVM 似乎正在决定将从中引发的 SIGPIPE 传递给我们的信号管理器。这样做是对的吗?send
另外,为什么调用堆栈不完整?我的意思是,显然它之前不能向我显示java代码,但是为什么我无法在java代码之前看到堆栈?socketWrite0