Abbiamo un'applicazione C++ con JVM (Sun) incorporata. Poiché registriamo i nostri gestori di segnale, è consigliabile farlo prima di inizializzare la JVM poiché installa i propri gestori (see here).Concatenamento del segnale JVM SIGPIPE
Da quello che ho capito, la JVM sa internamente se il segnale proviene dal proprio codice e se non lo passa lungo la catena - ai nostri gestori.
quello che abbiamo iniziato a vedere è che stiamo ottenendo SIGPIPEs, con uno stack di chiamate che si presenta più o meno come questo (l'entrata in alto è il nostro gestore di segnale):
/.../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]
Sembra che la JVM è decidere che il SIGPIPE che è stato sollevato da send
deve essere passato insieme al nostro segnale di blocco. È giusto quando lo fai?
Inoltre, perché lo stack di chiamate è incompleto? Voglio dire ovviamente non può mostrarmi il codice java prima del socketWrite0
ma perché non riesco a vedere lo stack prima del codice java?
Avete installato un gestore di segnale per SIGPIPE? (se sì, sì - è comune ottenere SIGPIPE dalle chiamate send() quando qualcuno scrive su un socket rotto) – nos
So che 'send' può generare SIGPIPE. Sto solo mettendo in discussione la decisione della JVM di trasmetterli a me, perché non solleva un'eccezione? –
Ma non hai installato un gestore per questo? – nos