首页 > 解决方案 > libc:致命信号 11 (SIGSEGV),代码 1,故障地址 0xcdb8007c

问题描述

Fatal signal 11 (SIGSEGV), code 1在stackoverflow上看到了很多问题,但没有人给出答案。

我的 JNI 代码:

JNIEXPORT jbyteArray JNICALL
Java_com_btc_testtwo_ProxyApplication_decrypt(JNIEnv *env, jobject instance,
                                              jbyteArray srcdata_) {
    jbyte *srcdata = env->GetByteArrayElements(srcdata_, NULL);
    print_debug("come in");
    while (*srcdata) {
        *srcdata ^= 0xF;
        *srcdata++;
    }
    print_debug("come out");
    env->ReleaseByteArrayElements(srcdata_, srcdata, 0);
}

我想知道位操作是否XOR改变了内存大小。我怀疑是内存错误引起的错误。我不知道代码是如何导致这个的。

标签: java-native-interface

解决方案


ReleaseByteArrayElements(srcdata_, srcdata, 0)GetByteArrayElements如果给你一个数组数据的副本,将会失败,因为你已经增加srcdata了,所以它不再包含你从GetByteArrayElements.

此外,您的 while 循环可能会访问超出数组末尾的数据,因为您没有考虑 的值GetArrayLength(srcdata_)


推荐阅读