2011-03-01 17 views
5

Al compilar y ejecutar el siguiente código en valgrind, siempre obtengo errores de "escritura no válida de tamaño 4". ¿Hay alguna forma clara de llamar a JNI_CreateJavaVM() para que valgrind no arroje un ajuste?¿Cómo se llama JNI_CreateJavaVM sin errores de Valgrind?

#include <jni.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    JavaVMInitArgs * vm_args = calloc(1, sizeof(JavaVMInitArgs)); 
    JavaVM * jvm = NULL; 
    JNIEnv * env = NULL; 

    vm_args->version = JNI_VERSION_1_6; 
    vm_args->nOptions = 0; 
    vm_args->options = NULL; 

    JNI_CreateJavaVM(&jvm, (void **)&env, vm_args); 

    return 0; 
} 

Este es el comando valgrind Me postulo:

valgrind --tool=memcheck --leak-check=yes --num-callers=20 --smc-check=all ./test 

Una sola entrada de mi loooonng registro valgrind:

==9004== Invalid write of size 4 
==9004== at 0x4D5A3C8: ??? 
==9004== by 0x4D512CB: ??? 
==9004== by 0x423374F: JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x4361B67: os::os_exception_wrapper(void (*)(JavaValue*, methodHandle*, JavaCallArguments*, Thread*), JavaValue*, methodHandle*, JavaCallArguments*, Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x42335AE: JavaCalls::call(JavaValue*, methodHandle, JavaCallArguments*, Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x420F8C5: instanceKlass::call_class_initializer_impl(instanceKlassHandle, Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x420E650: instanceKlass::initialize_impl(instanceKlassHandle, Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x420DB97: instanceKlass::initialize(Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x420E8AB: instanceKlass::initialize_impl(instanceKlassHandle, Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x420DB97: instanceKlass::initialize(Thread*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x440D660: Threads::create_vm(JavaVMInitArgs*, bool*) (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x4265395: JNI_CreateJavaVM (in /usr/java/jdk1.6.0_21/jre/lib/i386/client/libjvm.so) 
==9004== by 0x804845F: main (jvm.c:15) 
==9004== Address 0xbeb54078 is not stack'd, malloc'd or (recently) free'd 

Gracias, Chenz

+0

¿Puede proporcionar su archivo de supresión si logró hacer esto? – Etherealone

Respuesta

1

ya que este es un error dentro de la JVM puede simplemente elegir suprimirlo. Valgrind se puede configurar para suprimir errores específicos. Puede encontrar más detalles here

+0

La respuesta anterior es correcta: la JVM hace muchas cosas que valgrind no aprueba. Deberá suprimir esos errores, sin suprimir los errores del código que desea que valgrind compruebe. Ese es un tedioso proceso de prueba y error, lamentablemente. El uso de las supresiones generadas por valgrind puede facilitarlo, pero de ninguna manera es sencillo. Si termina con "demasiados llamantes en el seguimiento de la pila" de valgrind, consulte esta publicación: http://stackoverflow.com/a/11040043/203044 – BillT

Cuestiones relacionadas