【问题标题】:How do you call JNI_CreateJavaVM without Valgrind errors?如何在没有 Valgrind 错误的情况下调用 JNI_CreateJavaVM?
【发布时间】:2011-07-06 14:29:28
【问题描述】:

在 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

谢谢, 陈兹

【问题讨论】:

  • 如果你能做到,你能提供你的抑制文件吗?

标签: java c java-native-interface valgrind


【解决方案1】:

由于这是 JVM 中的错误,您可以选择抑制它。 Valgrind 可以配置为抑制特定的错误。您可以找到更多详情here

【讨论】:

  • 前面的答案是正确的——JVM做了很多valgrind不赞成的事情。您将需要抑制这些错误,而不是抑制您希望 valgrind 检查的代码中的错误。不幸的是,这是一个繁琐的反复试验过程。使用 valgrind 生成的抑制可以使这更容易,但它绝不是无痛的。如果你最终得到来自 valgrind 的“堆栈跟踪中的调用者太多”,请参阅这篇文章:stackoverflow.com/a/11040043/203044
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 2013-12-31
  • 1970-01-01
  • 2021-06-04
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多