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

Reply via email to