Tenemos una aplicación C++ con una JVM integrada (Sun). Debido a que registramos nuestros propios manejadores de señal, se recomienda que lo hagamos antes de inicializar la JVM, ya que instala sus propios manejadores (see here).Cadena de señal JVM SIGPIPE
Por lo que he entendido, la JVM sabe internamente si la señal se originó a partir de su propio código y si no lo pasa a lo largo de la cadena - a nuestros controladores.
lo que empezamos viendo es que nos estamos SIGPIPEs, con una pila de llamadas que se ve más o menos así (la entrada superior es nuestro manejador de señales):
/.../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]
Parece que la JVM es decidir que el SIGPIPE que se generó desde send
se debe pasar a nuestro dispositivo de transmisión de señal. ¿Está bien al hacerlo?
Además, ¿por qué la pila de llamadas está incompleta? Quiero decir, obviamente, no puede mostrarme código de Java antes de socketWrite0
, pero ¿por qué no puedo ver la pila antes del código de Java?
¿Ha instalado un controlador de señal para SIGPIPE? (De ser así, sí, es común obtener SIGPIPE de llamadas a send() cuando alguien escribe en un socket roto) – nos
Sé que 'send' puede generar SIGPIPE. Solo estoy cuestionando la decisión de la JVM de pasarmelas, ¿por qué no plantea una excepción? –
¿Pero no instaló un controlador para ello? – nos