NDK 一般分段错误,decStrong?
NDK general Segmentation fault, decStrong?
我在 android NDK 上遇到了一个非常奇怪的分段错误,但它并没有一直发生。我想问问你们的输入,如果有 none 那么我会尝试将其报告为错误。
我在与执行 C 代码相关的应用程序上按下了一个按钮。按钮和 C 代码有效,但我注意到在多次按下后,出现分段错误:
01-05 19:36:08.723 27256-27267/com.example.developer.addc A/libc﹕ Fatal signal 11 (SIGSEGV) at 0xb8c80677 (code=1), thread 27267 (Binder_1)
我 运行 在 logcat 输出上使用 ndk-stack 的堆栈跟踪看到了这个:
********** Crash dump: **********
Build fingerprint: 'samsung/klteuc/klteatt:4.4.2/KOT49H/G900AUCU1ANCE:user/release-keys'
pid: 28204, tid: 28217, name: Binder_2 >>> com.example.developer.addc <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr b8dedddf
Stack frame #00 pc 0000d176 /system/lib/libutils.so(android::RefBase::decStrong(void const*) const+3)
Stack frame #01 pc 0001cfef /system/lib/libbinder.so(android::IPCThreadState::processPendingDerefs()+82)
Stack frame #02 pc 0001db0f /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+42)
Stack frame #03 pc 00021965 /system/lib/libbinder.soStack frame #04 pc0000ea5d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
Stack frame #05 pc 00055f41 /system/lib/libandroid_runtime.so android::AndroidRuntime::javaThreadShell(void*)+68)
Stack frame #06 pc 0000e58f /system/lib/libutils.so Stack frame #07 pc 0000d298 /system/lib/libc.so (__thread_entry+72)
Stack frame #08 pc 0000d430 /system/lib/libc.so (pthread_create+240)
虽然所需的按钮按下次数似乎 运行dom,但此错误最终确实会发生。原生c代码为:
#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include "randomNumbers.h"
#define DEBUG_TAG "NDK_Tutorialapp"
jstring Java_com_example_developer_addc_MainActivity_getNumber(JNIEnv * env, jobject this, jint value1)
{
char *szFormat = "The random number is: %i";
char *randomResult;
int sum = randomness(value1);
randomResult = malloc(sizeof(szFormat) + 20);
jstring result;
if(randomResult!=NULL){
sprintf(randomResult, szFormat, sum);
result = (*env)->NewStringUTF(env, randomResult);
free(randomResult);
}
return result;
}
and 运行domness 是一个 运行dom 数字生成器,目前只返回一个常量。
有人熟悉这个问题吗?
你确定吗:
randomResult = malloc(sizeof(szFormat) + 20);
你分配了足够的内存? sizeof(szFormat)
将 return 4.
还有什么是JNIEnv
?
这个符号 ->
通常与指针一起使用,在您的情况下,您首先取消引用 env
,然后仍然应用 ->
.
我在 android NDK 上遇到了一个非常奇怪的分段错误,但它并没有一直发生。我想问问你们的输入,如果有 none 那么我会尝试将其报告为错误。
我在与执行 C 代码相关的应用程序上按下了一个按钮。按钮和 C 代码有效,但我注意到在多次按下后,出现分段错误:
01-05 19:36:08.723 27256-27267/com.example.developer.addc A/libc﹕ Fatal signal 11 (SIGSEGV) at 0xb8c80677 (code=1), thread 27267 (Binder_1)
我 运行 在 logcat 输出上使用 ndk-stack 的堆栈跟踪看到了这个:
********** Crash dump: **********
Build fingerprint: 'samsung/klteuc/klteatt:4.4.2/KOT49H/G900AUCU1ANCE:user/release-keys'
pid: 28204, tid: 28217, name: Binder_2 >>> com.example.developer.addc <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr b8dedddf
Stack frame #00 pc 0000d176 /system/lib/libutils.so(android::RefBase::decStrong(void const*) const+3)
Stack frame #01 pc 0001cfef /system/lib/libbinder.so(android::IPCThreadState::processPendingDerefs()+82)
Stack frame #02 pc 0001db0f /system/lib/libbinder.so (android::IPCThreadState::joinThreadPool(bool)+42)
Stack frame #03 pc 00021965 /system/lib/libbinder.soStack frame #04 pc0000ea5d /system/lib/libutils.so (android::Thread::_threadLoop(void*)+216)
Stack frame #05 pc 00055f41 /system/lib/libandroid_runtime.so android::AndroidRuntime::javaThreadShell(void*)+68)
Stack frame #06 pc 0000e58f /system/lib/libutils.so Stack frame #07 pc 0000d298 /system/lib/libc.so (__thread_entry+72)
Stack frame #08 pc 0000d430 /system/lib/libc.so (pthread_create+240)
虽然所需的按钮按下次数似乎 运行dom,但此错误最终确实会发生。原生c代码为:
#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <android/log.h>
#include "randomNumbers.h"
#define DEBUG_TAG "NDK_Tutorialapp"
jstring Java_com_example_developer_addc_MainActivity_getNumber(JNIEnv * env, jobject this, jint value1)
{
char *szFormat = "The random number is: %i";
char *randomResult;
int sum = randomness(value1);
randomResult = malloc(sizeof(szFormat) + 20);
jstring result;
if(randomResult!=NULL){
sprintf(randomResult, szFormat, sum);
result = (*env)->NewStringUTF(env, randomResult);
free(randomResult);
}
return result;
}
and 运行domness 是一个 运行dom 数字生成器,目前只返回一个常量。
有人熟悉这个问题吗?
你确定吗:
randomResult = malloc(sizeof(szFormat) + 20);
你分配了足够的内存? sizeof(szFormat)
将 return 4.
还有什么是JNIEnv
?
这个符号 ->
通常与指针一起使用,在您的情况下,您首先取消引用 env
,然后仍然应用 ->
.