malloc didn't return NULL. so memories maybe allocated correctly.
On Thu, Feb 24, 2011 at 1:15 PM, Dewr <[email protected]> wrote:
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en