我们有一个带有嵌入式JVM(Sun的)的C++应用程序。由于我们注册了自己的信号处理程序,建议在初始化JVM之前这样做,因为它安装了自己的处理程序(请参见此处)。
据我所知,JVM在内部知道信号是否来自其自己的代码,如果不是,则将其传递到我们的处理程序链中。
我们开始看到的是,我们收到了SIGPIPEs,并且调用堆栈大致如下(顶部条目是我们的信号处理程序):
似乎JVM决定将从
另外,为什么调用堆栈不完整?我的意思是,显然它无法显示
据我所知,JVM在内部知道信号是否来自其自己的代码,如果不是,则将其传递到我们的处理程序链中。
我们开始看到的是,我们收到了SIGPIPEs,并且调用堆栈大致如下(顶部条目是我们的信号处理程序):
/.../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决定将从
send
引发的SIGPIPE传递给我们的信号处理程序。这样做是正确的吗?另外,为什么调用堆栈不完整?我的意思是,显然它无法显示
socketWrite0
之前的Java代码,但为什么我看不到Java代码之前的堆栈?
send
可能会引发SIGPIPE错误。我只是质疑JVM将它们传递给我,为什么不引发异常? - Idan K