2011-03-01 9 views
5

valgrindの下で次のコードをコンパイルして実行すると、 "Invalid write of size 4"というエラーが表示されます。 JNI_CreateJavaVM()を呼び出すためのきれいな方法があるので、valgrindは適切に投げられませんか?ここでValgrindエラーなしでJNI_CreateJavaVMをどのように呼び出すのですか?

#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; 
} 

は、私が実行しているvalgrindのコマンドです:

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

私loooonngの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 

おかげで、 Chenz

+0

これを行うには、抑制ファイルを提供できますか? – Etherealone

答えて

1

これがあるので、 JVM内のエラーです。あなたはそれを抑圧することができます。 Valgrindは特定のエラーを抑制するように設定できます。あなたは詳細を見つけることができますhere

+0

前の答えは正しい--JVMは、valgrindが承認しない多くのことを行います。 valgrindでチェックしたいコードからのエラーを抑制するのではなく、それらのエラーを抑制する必要があります。それは残念なことに試行錯誤の面倒なプロセスです。 valgrindによって生成された抑制を使用すると、それを簡単にすることができますが、決して無駄ではありません。 valgrindから「スタックトレースにあまりにも多くの呼び出し元がある」ようになる場合は、この記事を参照してください:http://stackoverflow.com/a/11040043/203044 – BillT

関連する問題