OSXMavericksJNICallStaticVoidMethod生成SIGSEGV/SIGBUS(Java8)

OSXMavericksJNICallStaticVoidMethod生成SIGSEGV/SIGBUS(Java8),java,c,macos,java-native-interface,osx-mavericks,Java,C,Macos,Java Native Interface,Osx Mavericks,我有一个通过JNI运行Java的C应用程序。Java应用程序启动,做一些事情,一两秒钟后,我得到SIGSEGV或SIGBUS。没有java崩溃转储文件 这里是它崩溃的地方: libjvm.dylib`jni_CallStaticVoidMethod: 0x104ad1653 <+0>: pushq %rbp 0x104ad1654 <+1>: movq %rsp, %rbp 0x104ad1657 <+4>: pushq %r15 0x10

我有一个通过JNI运行Java的C应用程序。Java应用程序启动,做一些事情,一两秒钟后,我得到SIGSEGV或SIGBUS。没有java崩溃转储文件

这里是它崩溃的地方:

libjvm.dylib`jni_CallStaticVoidMethod:
0x104ad1653 <+0>:   pushq  %rbp
0x104ad1654 <+1>:   movq   %rsp, %rbp
0x104ad1657 <+4>:   pushq  %r15
0x104ad1659 <+6>:   pushq  %r14
0x104ad165b <+8>:   pushq  %r12
0x104ad165d <+10>:  pushq  %rbx
0x104ad165e <+11>:  subq   $0x150, %rsp
0x104ad1665 <+18>:  movq   %rdx, %rbx
0x104ad1668 <+21>:  movq   %rsi, %r14
0x104ad166b <+24>:  movq   %rdi, %r15
0x104ad166e <+27>:  testb  %al, %al
0x104ad1670 <+29>:  je     0x104ad16aa               ; <+87>
0x104ad1672 <+31>:  movaps %xmm0, -0x140(%rbp)
0x104ad1679 <+38>:  movaps %xmm1, -0x130(%rbp)
0x104ad1680 <+45>:  movaps %xmm2, -0x120(%rbp)
0x104ad1687 <+52>:  movaps %xmm3, -0x110(%rbp)
0x104ad168e <+59>:  movaps %xmm4, -0x100(%rbp)
0x104ad1695 <+66>:  movaps %xmm5, -0xf0(%rbp)
0x104ad169c <+73>:  movaps %xmm6, -0xe0(%rbp)
0x104ad16a3 <+80>:  movaps %xmm7, -0xd0(%rbp)
0x104ad16aa <+87>:  movq   %r9, -0x148(%rbp)
0x104ad16b1 <+94>:  movq   %r8, -0x150(%rbp)
0x104ad16b8 <+101>: movq   %rcx, -0x158(%rbp)
0x104ad16bf <+108>: movq   %r15, %rdi
0x104ad16c2 <+111>: callq  0x104c8c550               ; JavaThread::thread_from_jni_environment(JNIEnv_*)
0x104ad16c7 <+116>: movq   %rax, %r12
0x104ad16ca <+119>: movq   %r12, -0x28(%rbp)
0x104ad16ce <+123>: leaq   -0x28(%rbp), %rdi
0x104ad16d2 <+127>: movl   $0x6, %esi
0x104ad16d7 <+132>: callq  0x104926aac               ; ThreadStateTransition::trans_from_native(JavaThreadState)
0x104ad16dc <+137>: movq   %r12, -0x30(%rbp)
0x104ad16e0 <+141>: movq   %r12, -0x50(%rbp)
0x104ad16e4 <+145>: movq   $0x0, -0x48(%rbp)
0x104ad16ec <+153>: cmpq   $0x0, 0x8(%r12)
0x104ad16f2 <+159>: je     0x104ad16fd               ; <+170>
0x104ad16f4 <+161>: leaq   -0x50(%rbp), %rdi
0x104ad16f8 <+165>: callq  0x104c5cf7c               ; WeakPreserveExceptionMark::preserve()
0x104ad16fd <+170>: movq   %r14, %rsi
0x104ad1700 <+173>: movq   %r15, %rdi
0x104ad1703 <+176>: movq   %rbx, %rdx
0x104ad1706 <+179>: nop    
0x104ad1707 <+180>: nopl   (%rax)
0x104ad170b <+184>: leaq   -0x170(%rbp), %rax
0x104ad1712 <+191>: movq   %rax, -0x58(%rbp)
0x104ad1716 <+195>: leaq   0x10(%rbp), %rax
0x104ad171a <+199>: movq   %rax, -0x60(%rbp)
0x104ad171e <+203>: movl   $0x30, -0x64(%rbp)
0x104ad1725 <+210>: movl   $0x18, -0x68(%rbp)
0x104ad172c <+217>: movl   $0xe, -0x78(%rbp)
0x104ad1733 <+224>: movq   (%rbx), %rax
0x104ad1736 <+227>: movq   0x8(%rax), %rax
0x104ad173a <+231>: movzwl 0x22(%rax), %ecx
0x104ad173e <+235>: movq   0x8(%rax), %rax
0x104ad1742 <+239>: movq   0x50(%rax,%rcx,8), %rsi
0x104ad1747 <+244>: leaq   -0xb8(%rbp), %r14
0x104ad174e <+251>: movq   %r14, %rdi
0x104ad1751 <+254>: callq  0x104ca2c14               ; SignatureIterator::SignatureIterator(Symbol*)
0x104ad1756 <+259>: movl   $0x63, -0xa0(%rbp)
0x104ad1760 <+269>: movq   $0x0, -0x98(%rbp)
0x104ad176b <+280>: leaq   0x4f827e(%rip), %rax      ; vtable for JNI_ArgumentPusherVaArg
0x104ad1772 <+287>: addq   $0x10, %rax
0x104ad1776 <+291>: movq   %rax, -0xb8(%rbp)
0x104ad177d <+298>: movq   -0x58(%rbp), %rax
0x104ad1781 <+302>: movq   %rax, -0x80(%rbp)
0x104ad1785 <+306>: movq   -0x68(%rbp), %rax
0x104ad1789 <+310>: movq   -0x60(%rbp), %rcx
0x104ad178d <+314>: movq   %rcx, -0x88(%rbp)
0x104ad1794 <+321>: movq   %rax, -0x90(%rbp)
0x104ad179b <+328>: leaq   -0x78(%rbp), %rsi
0x104ad179f <+332>: movq   %r15, %rdi
0x104ad17a2 <+335>: movq   %rbx, %rdx
0x104ad17a5 <+338>: movq   %r14, %rcx
0x104ad17a8 <+341>: movq   %r12, %r8
0x104ad17ab <+344>: callq  0x104ad8877               ; jni_invoke_static(JNIEnv_*, JavaValue*, _jobject*, JNICallType, _jmethodID*, JNI_ArgumentPusher*, Thread*)
0x104ad17b0 <+349>: cmpq   $0x0, 0x8(%r12)
0x104ad17b6 <+355>: jne    0x104ad17bf               ; <+364>
0x104ad17b8 <+357>: nop    
0x104ad17b9 <+358>: nopl   (%rax)
0x104ad17bd <+362>: jmp    0x104ad17c4               ; <+369>
0x104ad17bf <+364>: nop    
0x104ad17c0 <+365>: nopl   (%rax)
0x104ad17c4 <+369>: cmpq   $0x0, -0x48(%rbp)
0x104ad17c9 <+374>: je     0x104ad17d4               ; <+385>
0x104ad17cb <+376>: leaq   -0x50(%rbp), %rdi
0x104ad17cf <+380>: callq  0x104c5cefa               ; WeakPreserveExceptionMark::restore()
0x104ad17d4 <+385>: leaq   -0x30(%rbp), %rdi
0x104ad17d8 <+389>: callq  0x1048ffc80               ; HandleMarkCleaner::~HandleMarkCleaner()
0x104ad17dd <+394>: leaq   -0x28(%rbp), %rdi
0x104ad17e1 <+398>: movl   $0x6, %esi
0x104ad17e6 <+403>: movl   $0x4, %edx
0x104ad17eb <+408>: callq  0x104931e04               ; ThreadStateTransition::trans_and_fence(JavaThreadState, JavaThreadState)
0x104ad17f0 <+413>: addq   $0x150, %rsp
0x104ad17f7 <+420>: popq   %rbx
0x104ad17f8 <+421>: popq   %r12
0x104ad17fa <+423>: popq   %r14
0x104ad17fc <+425>: popq   %r15
0x104ad17fe <+427>: popq   %rbp
0x104ad17ff <+428>: retq   
正如我所说,这并不是立即发生的——Java应用程序管理着做一些事情。当我尝试使用AWT gui类时,崩溃显然发生了。此外,日志显示该行(不确定是否相关):

这是一个JVM错误吗?我应该如何进行

编辑:

相关源代码:

void* runJava(void* arg) {

        JNIEnv *env;
        JavaVM * jvm;
        int nOptions = 1;

        char jvmLibPath[PATH_MAX];

        if (! jreSearch(jvmLibPath)) {
            return NULL;
        }

        void* handle = dlopen(jvmLibPath, RTLD_LAZY);

        NSLog(@"loaded jvm library %s\n", jvmLibPath);
        if (handle == NULL) {
            NSLog(@"error: %s\n", dlerror());
            exit(EXIT_FAILURE);
        }
        PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM) dlsym(handle, "JNI_CreateJavaVM");
        if (ptrCreateJavaVM == NULL) {
            fprintf(stderr, "%s\n", dlerror());
            exit(EXIT_FAILURE);
        }

        JavaVMOption* options = (JavaVMOption*) malloc(sizeof(JavaVMOption) * (nOptions));

        options[0].optionString = "-Djava.class.path=../MyJavaApp.jar";

        JavaVMInitArgs vm_args;
        vm_args.version = JNI_VERSION_1_8;
        vm_args.nOptions = nOptions;
        vm_args.options = options;
        vm_args.ignoreUnrecognized = 0;

        int ret = ptrCreateJavaVM(&jvm, (void**) &env, &vm_args);
        if (ret < 0)
            NSLog(@"\nUnable to Launch JVM\n");

        if (env == NULL) {
            exit(EXIT_FAILURE);
        }

        jclass mainClass = (*env)->FindClass(env, "mainpackage.MyMainClass");

        if (mainClass == 0) {
            NSLog(@"Failed to find class (or it's dependencies)");
        }

        jmethodID mainMethod = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
        if (mainMethod == 0) {
            NSLog(@"Failed to acquire main() method of main class\n");
            exit(EXIT_FAILURE);
        }

        NSArray *args = [[NSProcessInfo processInfo] arguments];
        int argc_ =(int)[args count];
        char** argv_ = getArray(args);

        //application name is not passed to java app, hence (argc - 1)
        jobjectArray appArgs = (*env)->NewObjectArray(env, argc_ - 1,(*env)->FindClass(env, "java/lang/String"), NULL);
        int i;
        for (i = 0; i < argc_ - 1; i = i + 1) {
            //argv[i + 1] skipps application name
            jstring arg = (*env)->NewStringUTF(env, argv_[i + 1]);
            (*env)->SetObjectArrayElement(env, appArgs, i, arg);
        }

        NSLog(@"calling main method\n");
        (*env)->CallStaticVoidMethod(env, mainClass, mainMethod, appArgs);
        NSLog(@"after main method\n");


        (*jvm)->DestroyJavaVM(jvm);
        if (options != NULL) {
            int i;
            for (i = 0; i < nOptions; i++) {
                free(options[i].optionString);
            }
        }

        NSLog(@"JVM destroyed\n");
        freeArray(argv_);

        pthread_mutex_lock(&javaFinishedMutex);
        pthread_cond_signal(&javaFinishedCond);
        pthread_mutex_unlock(&javaFinishedMutex);

        return NULL;
}
void*runJava(void*arg){
JNIEnv*env;
JavaVM*jvm;
int-nOptions=1;
char jvmLibPath[PATH_MAX];
if(!jreSearch(jvmLibPath)){
返回NULL;
}
void*handle=dlopen(jvmLibPath,RTLD_-LAZY);
NSLog(@“加载的jvm库%s\n”,jvmLibPath);
if(handle==NULL){
NSLog(@“错误:%s\n”,dlerror());
退出(退出失败);
}
PtrCreateJavaVM PtrCreateJavaVM=(PtrCreateJavaVM)dlsym(句柄,“JNI_CreateJavaVM”);
if(ptrCreateJavaVM==NULL){
fprintf(stderr,“%s\n”,dlerror());
退出(退出失败);
}
JavaVMOption*options=(JavaVMOption*)malloc(sizeof(JavaVMOption)*(nOptions));
选项[0]。选项字符串=“-Djava.class.path=../MyJavaApp.jar”;
JavaVMInitArgs vm_args;
vm_args.version=JNI_version_1_8;
vm_args.nOptions=nOptions;
vm_args.options=选项;
vm_args.ignoreunrecogned=0;
int-ret=ptrCreateJavaVM(&jvm,(void**)&env,&vm_args);
如果(ret<0)
NSLog(@“\n无法启动JVM\n”);
if(env==NULL){
退出(退出失败);
}
jclass mainClass=(*env)->FindClass(env,“mainpackage.MyMainClass”);
如果(mainClass==0){
NSLog(@“未能找到类(或其依赖项)”;
}
jmethodID main method=(*env)->GetStaticMethodID(env,main类,“main”,“([Ljava/lang/String;)V”);
如果(main方法==0){
NSLog(@“无法获取主类的main()方法\n”);
退出(退出失败);
}
NSArray*args=[[NSProcessInfo processInfo]参数];
int argc_=(int)[args计数];
字符**argv\ux=getArray(args);
//应用程序名称未传递给java应用程序,因此(argc-1)
jobjectArray Appags=(*env)->NewObjectArray(env,argc_u1;-1,(*env)->FindClass(env,“java/lang/String”),NULL;
int i;
对于(i=0;iNewStringUTF(env,argv_[i+1]);
(*env)->SetObjectArrayElement(env、appags、i、arg);
}
NSLog(@“调用主方法\n”);
(*env)->CallStaticVoidMethod(env、mainClass、mainMethod、appags);
NSLog(@“在主方法之后\n”);
(*jvm)->破坏JavaVM(jvm);
如果(选项!=NULL){
int i;
对于(i=0;i
显然,JVM在内部使用SIGBUS/SIGSEGV来控制应用(?)。我让mu调试器将这些信号传递给应用程序,现在一切正常。

我更愿意怀疑C代码中存在错误。导致内存损坏的东西。您是否可以访问应用程序的源代码?是的,我有应用程序的代码,但它是一个简单的标准C JNI代码,没有什么特别之处。此外,Java方法被调用并工作。之后有一段时间(2-3秒)我收到了上述信号之一。而且,在我收到信号后,应用程序仍在运行(或者该信号仅在调试时出现)我这么问是因为我经常在过早释放内存时看到类似的行为。只要没有人覆盖它,一切都会正常运行…我在帖子中添加了我正在使用的C JNI代码。这个函数(runJava)在单独的线程中运行(我试着使用POSIX线程和NSThread类-不管怎样,它可能正在使用POSIX-我只是在尝试我想到的一切)我创建了一个使用AWT的虚拟Java 8应用程序,使用原始的C JNI代码运行它,没有SIGSEGV。我不知道出了什么问题。
->  0x1058e5535: movl   0xc(%rdx), %r10d
    0x1058e5539: movl   0xc(%r12,%r10,8), %ebx
    0x1058e553e: movl   0x10(%rsi), %r8d
    0x1058e5542: movl   0xc(%r12,%r8,8), %r9d
    0x1058e5547: movl   %r9d, 0x14(%rsp)
    0x1058e554c: movl   0xc(%rsi), %r11d
    0x1058e5550: movl   %ebx, %ebp
    0x1058e5552: addl   %r11d, %ebp
WARNING: GL pipe is running in software mode (Renderer ID=0x1020400)
void* runJava(void* arg) {

        JNIEnv *env;
        JavaVM * jvm;
        int nOptions = 1;

        char jvmLibPath[PATH_MAX];

        if (! jreSearch(jvmLibPath)) {
            return NULL;
        }

        void* handle = dlopen(jvmLibPath, RTLD_LAZY);

        NSLog(@"loaded jvm library %s\n", jvmLibPath);
        if (handle == NULL) {
            NSLog(@"error: %s\n", dlerror());
            exit(EXIT_FAILURE);
        }
        PtrCreateJavaVM ptrCreateJavaVM = (PtrCreateJavaVM) dlsym(handle, "JNI_CreateJavaVM");
        if (ptrCreateJavaVM == NULL) {
            fprintf(stderr, "%s\n", dlerror());
            exit(EXIT_FAILURE);
        }

        JavaVMOption* options = (JavaVMOption*) malloc(sizeof(JavaVMOption) * (nOptions));

        options[0].optionString = "-Djava.class.path=../MyJavaApp.jar";

        JavaVMInitArgs vm_args;
        vm_args.version = JNI_VERSION_1_8;
        vm_args.nOptions = nOptions;
        vm_args.options = options;
        vm_args.ignoreUnrecognized = 0;

        int ret = ptrCreateJavaVM(&jvm, (void**) &env, &vm_args);
        if (ret < 0)
            NSLog(@"\nUnable to Launch JVM\n");

        if (env == NULL) {
            exit(EXIT_FAILURE);
        }

        jclass mainClass = (*env)->FindClass(env, "mainpackage.MyMainClass");

        if (mainClass == 0) {
            NSLog(@"Failed to find class (or it's dependencies)");
        }

        jmethodID mainMethod = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V");
        if (mainMethod == 0) {
            NSLog(@"Failed to acquire main() method of main class\n");
            exit(EXIT_FAILURE);
        }

        NSArray *args = [[NSProcessInfo processInfo] arguments];
        int argc_ =(int)[args count];
        char** argv_ = getArray(args);

        //application name is not passed to java app, hence (argc - 1)
        jobjectArray appArgs = (*env)->NewObjectArray(env, argc_ - 1,(*env)->FindClass(env, "java/lang/String"), NULL);
        int i;
        for (i = 0; i < argc_ - 1; i = i + 1) {
            //argv[i + 1] skipps application name
            jstring arg = (*env)->NewStringUTF(env, argv_[i + 1]);
            (*env)->SetObjectArrayElement(env, appArgs, i, arg);
        }

        NSLog(@"calling main method\n");
        (*env)->CallStaticVoidMethod(env, mainClass, mainMethod, appArgs);
        NSLog(@"after main method\n");


        (*jvm)->DestroyJavaVM(jvm);
        if (options != NULL) {
            int i;
            for (i = 0; i < nOptions; i++) {
                free(options[i].optionString);
            }
        }

        NSLog(@"JVM destroyed\n");
        freeArray(argv_);

        pthread_mutex_lock(&javaFinishedMutex);
        pthread_cond_signal(&javaFinishedCond);
        pthread_mutex_unlock(&javaFinishedMutex);

        return NULL;
}