Tengo una aplicación Java que llama a muchos métodos nativos diferentes de una aplicación heredada a través de JNI. Pero JVM se bloquea con un volcado de pila en lugares aleatorios, fuera de cualquier llamada JNI. A veces se cuelga durante el GC, a veces durante la carga de clases y otros lugares. Sospecho que uno o más métodos nativos corrompen el almacenamiento dinámico de JVM o alguna otra estructura de datos. Necesito saber qué llamada es esta, para poder arreglar la implementación nativa.Cómo depurar problemas de corrupción del montón de JNI?
El uso de la herencia es una DLL de 3 ª parte para la que no tengo ni fuentes de información de símbolos. Para hacerlo invocable desde Java, construí una DLL contenedora que usa convenciones de llamadas JNI.
La solución perfecta sería una opción JVM extendida que obliga JVM para comprobar automáticamente la integridad del montón y sus otras estructuras de datos después de cada llamada JNI.
¿Conoce algo que puede ayudar?
P.S. Por favor, no me diga que construya un zócalo o capa de tubería entre JVM y la aplicación heredada, porque nuestros requisitos no lo permiten. Se trata de la detección de errores, no del diseño de la arquitectura.
Asumo que sabes sobre '-Xcheck: jni'? – Erik
Sí, pero gracias por preguntar. – fernacolo
Tengo el mismo problema, si esto ayuda:/Tengo una gran cantidad de datos que viajan a través de JNI, y ocasionalmente obtengo una dirección y datos de paquetes corruptos. Atornilla toda la simulación, y es realmente molesto. –