Hello, I am porting a C program. The problem I've met is SIGSEGV on free(). I can't see what's the root cause of it. it doesn't occur sometimes, but very often.
I am testing it on NexusOne 2.2.1 I am using Android NDK r5b and Android SDK and Eclipse ADT and Cygwin. I am using *android.content.res.AssetFileDescriptor* to read assets in C modules. Here is the messages in ndk-gdb when the problem appears. > (gdb) c > Continuing. > > Breakpoint 2, Java_kr_co_pkbio_Unse_DangSaJuShinSal (env=0xaa50, > obj=0x4495b970) > at > C:/DEWR/Product/Software-Engineering/Eclipse-Workspace/Unse/jni/unse.c:1 > 83 > *1083 free(strBuf);* > (gdb) next > > *Program received signal SIGSEGV, Segmentation fault.* > *0xafd11c80 in __libc_android_abort ()* > from > C:/DEWR/Product/Software-Engineering/Eclipse-Workspace/Unse/obj/local/a > meabi/libc.so > (gdb) bt > #0 0xafd11c80 in __libc_android_abort () > from > C:/DEWR/Product/Software-Engineering/Eclipse-Workspace/Unse/obj/local/a > meabi/libc.so > #1 0xbec233bc in ?? () > Cannot access memory at address 0xc > (gdb) quit > Here is the Java source code... > public static FileInfoForNativeCode openAssets(String fname) { > if (Constants.VERBOSE_LOGS) > Log.d(TAG, "openAssets("+fname+")"); > > *AssetFileDescriptor myDescriptor = null;* > try { > myDescriptor = context.getAssets().openFd(fname+".jet"); > } catch (IOException e) { > e.printStackTrace(); > return null; > } > FileDescriptor fd = myDescriptor.getFileDescriptor(); > long off = myDescriptor.getStartOffset(); > long len = myDescriptor.getLength(); > > if (Constants.VERBOSE_LOGS) > Log.d(TAG, "fd:"+fd+" off:"+off+" len:"+len); > > return new FileInfoForNativeCode(off, len, fd); > } > Here is the C source code... > char* getTextByIndex (TextFileBufType *filebuf, char *index) { > #define _INDEX_PREFIX_ '@' > int i, j, lenBuf; > char *result; > char indexPrefix = _INDEX_PREFIX_; > int lenIndexPrefix = utf8len( &indexPrefix ); > int lenIndex = strlen(index); > > for ( i = 0 ; i < filebuf->total ; i++ ) { > *//__android_log_print(ANDROID_LOG_DEBUG,"TAG", "JNI : %d -> %s", > i, filebuf->text[i]);* > > if ( memcmp (filebuf->text[i], &indexPrefix, lenIndexPrefix) != 0 ) > continue; > > if ( memcmp (filebuf->text[i]+lenIndexPrefix, index, lenIndex) != 0 > ) > continue; > > lenBuf = 0; > lenBuf += strlen(filebuf->text[i]); > lenBuf++; > for ( j = i+1 ; j < filebuf->total ; j++ ) { > if ( memcmp (filebuf->text[j], &indexPrefix, lenIndexPrefix) == > 0 ) > break; > > lenBuf += strlen(filebuf->text[j]); > lenBuf++; > } > > *result = malloc(lenBuf);* > result[0] = 0; > strcat(result, filebuf->text[i]); > strcat(result, "\n"); > for ( j = i+1 ; j < filebuf->total ; j++ ) { > if ( memcmp (filebuf->text[j], &indexPrefix, lenIndexPrefix) == > 0 ) > break; > > strcat(result, filebuf->text[j]); > strcat(result, "\n"); > } > > *//__android_log_print(ANDROID_LOG_DEBUG,"TAG", "JNI : %d!!! -> > %s", i, filebuf->text[i]);* > *return result;* > } > > return NULL; > > #undef _INDEX_PREFIX_ > } > > inline void readyFileInFile (FileInFile *fif, char *path) > { > jstring jstrFpath; > jobject finfo; > jobject descriptor; > > jstrFpath = (*gEnv)->NewStringUTF(gEnv, path); > finfo = (*gEnv)->CallStaticObjectMethod(gEnv, clsUtility, > midOpenAssets, jstrFpath); > fif->offset = (*gEnv)->GetLongField(gEnv, finfo, fidOffset); > fif->length = (*gEnv)->GetLongField(gEnv, finfo, fidLength); > descriptor = (*gEnv)->GetObjectField(gEnv, finfo, fidDescriptor); > fif->fd = (*gEnv)->GetIntField(gEnv, descriptor, > fidDescriptorFileDescriptor); > } > > jobjectArray Java_kr_co_pkbio_Unse_DangSaJuShinSal (JNIEnv *env, jobject > obj) { > *// char *fname = "DangSaJu_ShinSal";* > int i, fileno[4], ret_code, type; > char temp[256]; > char *header[4] = { "년", "월", "일", "시" }; > char table1[12] = { 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2 }; > char table2[4] = {10, 7, 4, 1}; > > char *index[12] = { > "겁살", "재살", "천살", "지살", "연살", "월살", > "망신살", "장성살", "반안살", "역마살", "육해살", "화개살" > }; > > int r_option; > int numBytesRead; > char *strBuf; > TextFileBufType filebuf; > jstring buf_output[4]; > jobjectArray output; > FileInFile fif; > > gEnv = env; > > */* 년월일시에 대한 겁살을 계산한다 */* > type = table1[BaseInfo.saju.day % 12]; > fileno[0] = (table2[type] + (BaseInfo.saju.year % 12)) % 12; > fileno[1] = (table2[type] + (BaseInfo.saju.month % 12)) % 12; > fileno[2] = (table2[type] + (BaseInfo.saju.day % 12)) % 12; > fileno[3] = (table2[type] + (BaseInfo.saju.hour % 12)) % 12; > */*WriteMsg (" - 기본위치 : 생일지지(%s) --> type:%d --> 자(%s)에 대한 살:%s\n", > JeeJeeStr[BaseInfo.saju.day % 12], type, JeeJeeStr[0], > index[table2[type]]); > WriteMsg (" - 년살 : 생년지지(%s) --> 년%s\n", > JeeJeeStr[BaseInfo.saju.year % 12], > index[fileno[0]]); > WriteMsg (" - 월살 : 생월지지(%s) --> 월%s\n", > JeeJeeStr[BaseInfo.saju.month % 12], > index[fileno[1]]); > WriteMsg (" - 일살 : 생일지지(%s) --> 일%s\n", JeeJeeStr[BaseInfo.saju.day > % 12], > index[fileno[2]]); > WriteMsg (" - 시살 : 생시지지(%s) --> 시%s\n", > JeeJeeStr[BaseInfo.saju.hour % 12], > index[fileno[3]]);*/* > > > readyFileInFile(&fif, "data/DangSaJu5.dat"); > > r_option = ((int)'#' << 8) & 0xFF00; /* Comment char setting */ > r_option |= (RT_OPT_RMCMT | RT_OPT_RMCRLF | RT_OPT_LTRIM | RT_OPT_RTRIM > | RT_OPT_SPACES); > > if ( ReadTextFileToBufA (&filebuf, &fif, r_option) < 0 ) { > __android_log_print(ANDROID_LOG_ERROR,"TAG", "JNI : 서버측에서 치명적인 오류가 > 발생하여 더이상 진행할 수 없습니다."); > return NULL; > } > > for ( i = 0 ; i < 4 ; i++ ) { > sprintf (temp, "%s%s", header[i], index[fileno[i]]); > *strBuf = getTextByIndex(&filebuf, temp);* > *//__android_log_print(ANDROID_LOG_DEBUG,"TAG", "JNI : %s -> %s", > temp, strBuf );* > buf_output[i] = (*gEnv)->NewStringUTF(gEnv, strBuf); > * free(strBuf); //line number : 1083 ***It doesn't cause SIGSEGV on > first for-loop-round, but on third for-round.**** > *//PrintTextFile3 ("../data/DangSaJu5.dat", temp, VIEW_T_R_STR, > // "12신살로 알아보는 인생의 길흉화복 : %s", temp); > /*if (i < 3) { > sprintf (temp, "\n 계속해서 %s%s에 대한 풀이를 보시겠습니까? (Y/n)", > header[i+1], index[fileno[i+1]]); > ret_code = GetYesNo (temp, GETYN_YES); > if (ret_code == GETYN_NO) return; > }*/* > } > > FreeTextFileBuf (&filebuf); > *//printf ("\n [Enter]키를 누르세요."); fflush(stdout); > //PauseUntil (300, 0);* > *#if defined (_DO_NOT_COMPILE_) > { > int j; > for (i=0 ; i<4 ; i++) { > for (j=0 ; j<12 ; j++) { > sprintf (temp, "%s%s", header[i], index[j]); > ** //PrintTextFile3 ("../data/DangSaJu5.dat", temp, > VIEW_T_R_STR, > // "당사주 / 인생 길흉화복 datafile test : %s", temp); > } > } > } > #endif* > > output = (*gEnv)->NewObjectArray(gEnv, 4, clsString, NULL); > (*gEnv)->SetObjectArrayElement(gEnv, output, 0, buf_output[0]); > (*gEnv)->SetObjectArrayElement(gEnv, output, 1, buf_output[1]); > (*gEnv)->SetObjectArrayElement(gEnv, output, 2, buf_output[2]); > (*gEnv)->SetObjectArrayElement(gEnv, output, 3, buf_output[3]); > > return output; > } > -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en