2012-07-04 11 views
7

Ho un'applicazione Java 1.6 che accede a un modulo nativo di terze parti, attraverso una classe JNI fornita come interfaccia. Recentemente abbiamo notato che un SEGFAULT si sta verificando nel modulo nativo e sta causando il crash della nostra applicazione. È possibile catturare e gestire questo evento, almeno per registrarlo correttamente prima di morire?È possibile gestire un SEGFAULT che si origina nel codice nativo?


Ho provato entrambe le tecniche Java nell'articolo da kjp's answer. Nessuno dei due ha funzionato. Il tentativo di installare un signal handler sui risultati 'SEGV' nell'eccezione

segnale già utilizzato da VM: SEGV

Il shutdown handler ho installato non è riuscito semplicemente a sparare, presumibilmente a causa di ciò che il IBM article stati:

ganci di arresto non verranno eseguiti se metodo

Runtime.halt() viene chiamato per terminare la JVM. Runtime.halt() viene fornito per consentire un arresto rapido della JVM.
L'opzione -Xrs JVM è specificata.
La JVM esce in modo anomalo, come una condizione di eccezione o l'interruzione forzata generata dal software JVM.

+0

Sono disponibili simboli di debug pubblici per il codice nativo? Se riesci a trovare ulteriori informazioni sul motivo per cui sta accadendo, potresti essere in grado di inviare una segnalazione di bug abbastanza completa da indurli a correggere la loro biblioteca. – Benj

+0

@ Benj Lavorando su questo in parallelo. Avranno più informazioni di quanto vogliono. Speravo di avere un piano di backup. –

+0

Su quale sistema operativo si sta eseguendo? – Benj

risposta

2

Se tutto ciò che si vuole fare è registrare e notificare, è possibile scrivere uno script che esegua la propria applicazione. Quando l'applicazione muore, lo script può rilevare se l'applicazione è terminato normalmente e dal file hs_errXXXX che ha tutte le crash/informazioni SEGV e spedirla a qualcuno (e riavviare l'applicazione se si desidera)


Quello che è necessario eseguire il codice JNI difettoso in un'altra JVM e comunicare con quella JVM utilizzando RMI o JMS o Socket. In questo modo quando la libreria muore, non farà cadere la tua applicazione principale e potrai riavviarla.

+1

Alcune importanti implicazioni sulle prestazioni con questa operazione ... Dovrebbe essere l'unica opzione rimasta per tentarmi di andare in questo modo. – Benj

1

Sulla base di diverse settimane di ricerca al momento, così come conversazioni con ingegneri JVM in una conferenza questo non è possibile. Il sistema non ti permetterà di installare un SignalHandler sul segnale SEGV.