09-23 07:27:40.408: INFO/DEBUG(31): Build fingerprint: 'generic/sdk/generic/:2.2/FRF91/43546:eng/test-keys'
09-23 07:27:40.408: INFO/DEBUG(31): pid: 1250, tid: 1250 >>> android.app.ImageProc <<<
09-23 07:27:40.418: INFO/DEBUG(31): signal 11 (SIGSEGV), fault addr 000000f2
09-23 07:27:40.418: INFO/DEBUG(31): r0 00000000 r1 bee7d64c r2 000000e8 r3 000000e9
09-23 07:27:40.428: INFO/DEBUG(31): r4 000000ec r5 000000ef r6 000000f0 r7 000000ed
09-23 07:27:40.439: INFO/DEBUG(31): r8 000000e8 r9 000000e9 10 000000ea fp 000000eb
09-23 07:27:40.439: INFO/DEBUG(31): ip afa030c8 sp bee7d878 lr afa010bf pc 000000f2 cpsr 60000010
09-23 07:27:40.558: INFO/DEBUG(31): #00 pc 000000f2
09-23 07:27:40.568: INFO/DEBUG(31): #01 pc 000010bc /system/lib/liblog.so
09-23 07:27:40.568: INFO/DEBUG(31): code around pc:
09-23 07:27:40.568: INFO/DEBUG(31): 000000d0 ffffffff ffffffff ffffffff ffffffff
09-23 07:27:40.593: INFO/DEBUG(31): 000000e0 ffffffff ffffffff ffffffff ffffffff
09-23 07:27:40.593: INFO/DEBUG(31): 000000f0 ffffffff ffffffff ffffffff ffffffff
09-23 07:27:40.598: INFO/DEBUG(31): 00000100 ffffffff ffffffff ffffffff ffffffff
09-23 07:27:40.598: INFO/DEBUG(31): 00000110 ffffffff ffffffff ffffffff ffffffff
09-23 07:27:40.598: INFO/DEBUG(31): code around lr:
09-23 07:27:40.598: INFO/DEBUG(31): afa0109c 4b0cb5f8 1c151c0f 2409447b dc0f2803
09-23 07:27:40.598: INFO/DEBUG(31): afa010ac 00804a09 58c6189b 1c391c30 f7ff1c2a
09-23 07:27:40.598: INFO/DEBUG(31): afa010bc 1e04ee70 f7ffda04 6801ee84 d0f32904
09-23 07:27:40.598: INFO/DEBUG(31): afa010cc bdf81c20 00002010 000000a8 4c2fb5f0
09-23 07:27:40.598: INFO/DEBUG(31): afa010dc 9000b089 9101447c 1c1f1c15 d1012a00
09-23 07:27:40.608: INFO/DEBUG(31): stack:
09-23 07:27:40.608: INFO/DEBUG(31): bee7d838 000000df
09-23 07:27:40.618: INFO/DEBUG(31): bee7d83c 000000e0
09-23 07:27:40.618: INFO/DEBUG(31): bee7d840 000000e2
09-23 07:27:40.628: INFO/DEBUG(31): bee7d844 000000e2
09-23 07:27:40.628: INFO/DEBUG(31): bee7d848 000000e5
09-23 07:27:40.628: INFO/DEBUG(31): bee7d84c 000000e5
09-23 07:27:40.628: INFO/DEBUG(31): bee7d850 000000e7
09-23 07:27:40.628: INFO/DEBUG(31): bee7d854 000000e8
09-23 07:27:40.639: INFO/DEBUG(31): bee7d858 000000e9
09-23 07:27:40.639: INFO/DEBUG(31): bee7d85c 000000ea
09-23 07:27:40.649: INFO/DEBUG(31): bee7d860 000000eb
09-23 07:27:40.649: INFO/DEBUG(31): bee7d864 000000ec
09-23 07:27:40.658: INFO/DEBUG(31): bee7d868 000000ef
09-23 07:27:40.658: INFO/DEBUG(31): bee7d86c 000000f0
09-23 07:27:40.658: INFO/DEBUG(31): bee7d870 df002777
09-23 07:27:40.658: INFO/DEBUG(31): bee7d874 e3a070ad
09-23 07:27:40.658: INFO/DEBUG(31): #01 bee7d878 000000ee
09-23 07:27:40.668: INFO/DEBUG(31): bee7d87c 000000f4
09-23 07:27:40.668: INFO/DEBUG(31): bee7d880 000000f1
09-23 07:27:40.678: INFO/DEBUG(31): bee7d884 000000f6
09-23 07:27:40.678: INFO/DEBUG(31): bee7d888 000000f3
09-23 07:27:40.678: INFO/DEBUG(31): bee7d88c 000000f8
09-23 07:27:40.678: INFO/DEBUG(31): bee7d890 000000f5
09-23 07:27:40.678: INFO/DEBUG(31): bee7d894 000000f7
09-23 07:27:40.678: INFO/DEBUG(31): bee7d898 000000fc
09-23 07:27:40.678: INFO/DEBUG(31): bee7d89c 000000fd
09-23 07:27:40.678: INFO/DEBUG(31): bee7d8a0 000000fe
09-23 07:27:40.678: INFO/DEBUG(31): bee7d8a4 000000ff
09-23 07:27:40.678: INFO/DEBUG(31): bee7d8a8 00000100
09-23 07:27:40.678: INFO/DEBUG(31): bee7d8ac 00000101
09-23 07:27:40.678: INFO/DEBUG(31): bee7d8b0 00000123
09-23 07:27:40.678: INFO/DEBUG(31): bee7d8b4 00000123
09-23 07:27:40.689: INFO/DEBUG(31): bee7d8b8 00000126
09-23 07:27:40.689: INFO/DEBUG(31): bee7d8bc 00000126
09-23 07:27:41.418: DEBUG/Zygote(33): Process 1250 terminated by signal (11)
09-23 07:27:41.448: INFO/ActivityManager(60): Process android.app.ImageProc (pid 1250) has died.
09-23 07:27:41.468: INFO/BootReceiver(60): Copying /data/tombstones/tombstone_07 to DropBox (SYSTEM_TOMBSTONE)
09-23 07:27:41.518: INFO/UsageStats(60): Unexpected resume of com.android.launcher while already resumed in android.app.ImageProc
09-23 07:27:41.578: WARN/InputManagerService(60): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43fc45a8
09-23 07:27:46.808: DEBUG/dalvikvm(270): GC_EXPLICIT freed 50 objects / 2424 bytes in 72ms
인터넷 검색했더니 signal 11 은 세그먼테이션 오류라고하는데..
이게 할당되지 않은 메모리를 참조하려고 할 때 발생하는 에러라고 알고있는데 맞나요?
근데 이상한건, native code에서 해당 함수가 종료되기 직전에 logcat을 찍도록 해봤는데요,
__android_log_print(ANDROID_LOG_INFO, "Native", "Complete!");
return 0;
}
이게 찍힌다음에 signal 11 을 날린다는겁니다.
그니까 제 생각에는 정상적으로 함수가 종료되고나서 문제가 생긴다는건데.. 이런경우도 있나요? ;;
혹시나 할당안된 포인터를 native에서 return 하고 그걸 java에서 참조하려고할땐 NullPointerException 이 발생한다고
알고있는데 말입니다;;
로그 찍어서 디버깅하는 수준으로는 더 이상 파고들수가 없네요 ㅠㅠ 고수님들 좀 도와주세요 ㅠ
NDK 부분과 호출하는 부분도 좀 알아야 할거 같군요...
그리고 저건 GDB로 디버깅하는게 잴 빠르긴 합니다. 주소 때려보면 되거든요...
0x000000f2 라는 주소를 보면 알수가 있는건데...
jboolean Java_android_app_ImageProc_InterfaceJNI_RemoveBG
(JNIEnv *env, jobject thiz)
{
int i, j, k;
int poWidth, poHeight, remainIdx;
int remainLabel[100];
__android_log_print(ANDROID_LOG_INFO, "Native", "mLTIndex : %d", mLTIndex);
__android_log_print(ANDROID_LOG_INFO, "Native", "mAvgLineDis : %d", mAvgLineDis);
// 점의 Label값은 remainLabel 배열에 저장하여 예외처리 한다.
for(remainIdx=0, i=1; i<mLTIndex; i++){
poWidth = mNotePos[i].x_end - mNotePos[i].x_start;
poHeight = mNotePos[i].y_end - mNotePos[i].y_start;
// mAvgLineDis 전역변수
if((mAvgLineDis - 1) > poWidth && (mAvgLineDis - 1) > poHeight){
for(k = mNotePos[i].y_start; k<mNotePos[i].y_end; k++){
for(j = mNotePos[i].x_start; j<mNotePos[i].x_end; j++){
if(mLabelingTable[j+k*mWidth] != INIT_LABEL){
remainLabel[remainIdx++] = mLabelingTable[j+k*mWidth];
break;
}
}
if(j != mNotePos[i].x_end) break;
}
}
}
// 오선이 포함된 Label값도 지우지 말아야 하므로, remainLabel 배열에 저장한다.
for(i=0; i<mIndex; i+=5)
remainLabel[remainIdx++] = mLabelingTable[mWidth/2 + mLinePos[i]*mWidth];
__android_log_print(ANDROID_LOG_INFO, "Native", "remainIdx : %d", remainIdx);
__android_log_print(ANDROID_LOG_INFO, "Native", "mHeight : %d, mWidth : %d, len : %d", mHeight, mWidth, len);
// Background를 지운다.
for(i=0; i<mHeight; i++){
for(j=0; j<mWidth; j++){
for(k=0; k<remainIdx; k++)
if(mLabelingTable[j+i*mWidth] == remainLabel[k]){
break;
}
if(k == remainIdx){
rawImage[j+i*mWidth] = jWHITE;
}
}
}
__android_log_print(ANDROID_LOG_INFO, "Native", "Complete!");
return 0;
}
흠. 이 함수를 그대로 호출하는건데요.. 전역변수도 많고 해서 올리는게 의미가 있을런지 ㅠ
GDB로 주소 때려본다는건 어떤건가요?? ㅠㅠ
그리고 return 0; 이부분을 JNI_FALSE로 해보세요...
흠.. JNI_FALSE 로 고쳐도 똑같네요. ㅠ
이게 이상한게요, 위에 다른 함수에서 제가 실수로 mIndex 변수를 실제 들어가야 할 값보다 1 적게 들어가도록 해서
전엔 됫었는데..
오늘 그 부분 수정하고나서 안되는거거든요a
mIndex 를 이용해서 어떤 메모리를 참조하면서 Signal 11이 발생하는건가 싶긴한데..
지금 위에 올린 함수에서는 하나하나 로그 다 찍어봤는데도 문제가 없는지라..
혹시나 실제로 프로그램은 죽었는데 로그를 날린다거나 -_-;; 아니면 에러가 났는데 참다가(?)
이 함수 끝나고 죽어버리는.. 그런 일은 없는거겠죠? -_-;;;;
하다하다 안되니까 별별 상상이 다 되네요 ㅠㅠ
음.. liblog.so 뭐라고 써있길래 log 찍는 함수가 이상한가해서 그 부분들을 다 주석처리하고 돌렸더니
09-23 07:34:58.288: INFO/DEBUG(31): #01 pc 00013974 /system/lib/libdvm.so
이렇게 바뀌네요;
fault arrd 는 그대로구요.. ㅠ