thank you guys. I really appreciate your advice. I have debugged by putting this 1 line code right after free(strBuf); (though there is no repeating free(strBuf)...)
> strBuf = NULL; > thank you! :D 2011/3/24 Hari Edo <hari....@gmail.com> > > This has nothing to do with Android, per se. > > > Calling free(x) when x is NULL is not harmful. > Calling free(x) when x came from malloc() is not harmful. > Calling free(x) twice with the same value of x will surely SIGSEGV. > Calling free(x) with a bad value will likely SIGSEGV. > > Note case 3: if you call free(x), follow it immediately with x=NULL, > and you will probably not crash anymore. Matching your malloc()/ > free() > calls carefully and logically tends to fix such problems. > > > > > On Mar 22, 4:26 am, Dewr <wind8...@gmail.com> wrote: > > I have tested it on Galaxy S and it worked well on Galaxy S (2.2). I have > > not tried it on another Nexus One in order to know if my Nexus One is > > faulty. > > > > and it seems like that AssetFileDescriptor is not the source of the > problem, > > because the problem is still ocurring while I didn't access asset files > > directly but accessing copied ones. > > > > > > > > On Fri, Feb 25, 2011 at 1:10 PM, Dewr <wind8...@gmail.com> wrote: > > > it often causes SIGSEGV on third for-loop. but just a moment ago > SIGSEGV on > > > fourth loop. > > > > >> for ( i = 0 ; i < 4 ; i++ ) { > > >> sprintf (temp, "%s%s", header[i], index[fileno[i]]); > > >> *strBuf = getTextByIndex(&filebuf, temp);* *//malloc() in this > > >> function.* > > >> if (strBuf == NULL) > > >> buf_output[i] = NULL; > > >> else > > > > >> { > > >> buf_output[i] = (*gEnv)->NewStringUTF(gEnv, strBuf); > > >> * free(strBuf);* > > >> } > > >> } > > > > > On Thu, Feb 24, 2011 at 1:15 PM, Dewr <wind8...@gmail.com> 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 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 > -- 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