2012-07-04 13 views
7

Tengo una aplicación Java 1.6 que accede a un módulo nativo de un tercero, a través de una clase JNI proporcionada como interfaz. Recientemente notamos que se está produciendo un SEGFAULT en el módulo nativo y está causando que nuestra aplicación falle. ¿Es posible atrapar y manejar este evento, al menos para iniciar sesión correctamente antes de morir?¿Es posible manejar un SEGFAULT orginating en código nativo?


He intentado tanto técnicas de Java en el artículo de kjp's answer. Ninguno funcionó. El intento de instalar un signal handler en los resultados 'SEGV' en la excepción

señal ya utilizada por VM: SEGV

El shutdown handler he instalado simplemente no disparó, presumiblemente debido a lo que los IBM article estados:

ganchos de cierre no se llevará a cabo si el método

Runtime.halt() es llamado para terminar la JVM. Runtime.halt() se proporciona para permitir un cierre rápido de la JVM.
La opción -Xrs JVM está especificada.
La JVM sale anormalmente, como una condición de excepción o un aborto forzado generado por el software JVM.

+0

¿Hay símbolos de depuración públicos disponibles para el código nativo? Si puede encontrar más información sobre por qué está sucediendo, es posible que pueda enviar un informe de errores lo suficientemente completo para que solucione su biblioteca. – Benj

+0

@Benj Trabajando en eso en paralelo. Obtendrán más información de la que desean. Esperaba tener un plan de respaldo. –

+0

¿En qué sistema operativo se está ejecutando? – Benj

Respuesta

2

Si todo lo que desea hacer es registrar y notificar, puede escribir un script que ejecute su aplicación. Cuando la aplicación muere, el script puede detectar si la aplicación termina normalmente y desde el archivo hs_errXXXX que tiene todo el desplome de información/SEGV y enviarlo por correo a alguien (y reinicie la aplicación si se quiere)


Lo que lo que hay que hacer es ejecutar el código JNI defectuoso en otra JVM y comunicarse con esa JVM usando RMI o JMS o Sockets. De esta forma, cuando la biblioteca muera, no se reducirá su aplicación principal y podrá reiniciarla.

+1

Algunas implicaciones significativas en el rendimiento al hacer esto ... Tendría que ser la única opción que queda para tentarme a ir por este camino. – Benj

1

De acuerdo con varias semanas de investigación en el momento, así como las conversaciones con los ingenieros de JVM en una conferencia esto no es posible. El sistema no le permitirá instalar un SignalHandler en la señal SEGV.

Cuestiones relacionadas