作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 valgrind 下编译和运行以下代码时,我一直收到“Invalid write of size 4”错误。有没有一种调用 JNI_CreateJavaVM() 的简洁方法,这样 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;
}
这是我正在运行的 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
谢谢,陈子
最佳答案
由于这是 JVM 中的错误,您可以选择抑制它。 Valgrind 可以配置为抑制特定错误。您可以找到更多详细信息 here
关于java - 如何在没有 Valgrind 错误的情况下调用 JNI_CreateJavaVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156502/
我是一名优秀的程序员,十分优秀!