[완료] 구조체 memset시 코어덤프 현상입니다.
글쓴이: gennaio / 작성시간: 금, 2009/09/25 - 5:59오후
아래 소스에서 굵게 표시된 부분에서 구조체 멤셋시에 코어덤프가 나서 끝나버리네요.
아직 초보인지라 요게 쉽게 풀리지가 않네요.. 힌트주시면 정말 열심히 해볼게요.
사정상 소스 해독에 필요가 없는 부분은 줄였으니 이해부탁드립니다.
그리고 만약에
context->out->stDpSysIdx->zDataDiv 이런 식으로 구조체 안을 포인터로 접근할려면
어떤 부분이 더 첨가 되어야 가능할까요?
고수님들의 많은 조언 부탁드립니다.
/* 데이터 기본 FORMAT */ typedef struct DpSysBaseHdr_s { char zDataLen [4 + 1]; /* 데이터 길이 */ char zDataDiv [4 + 1]; /* 데이터 구분 */ } DpSysBaseHdr_t; /* 지수전문 */ typedef struct DpSysIdx_s { char zDataDiv [ 1 + 1]; /* 데이터구분 */ char zSysTm [ 6 + 1]; /* 시스템시각 */ char zIdxCd [ 2 + 1]; /* 지수코드 */ char zIdxNm [20 + 1]; /* 지수명 */ char zCalTm [ 6 + 1]; /* 산출시간 */ char zIdx [ 8 + 1]; /* 지수 */ char zSign [ 1 + 1]; /* 부호 */ char zCmp [ 8 + 1]; /* 대비 */ } DpSysIdx_t; /* 종목전문 */ typedef struct DpSysItem_s { char zDataDiv [ 1 + 1]; /* 데이터구분 */ char zSysTm [ 6 + 1]; /* 시스템시각 */ char zItemCd [12 + 1]; /* 종목코드 */ char zItemNm [20 + 1]; /* 지수명 */ char zCalTm [ 6 + 1]; /* 산출시간 */ char zIdx [ 8 + 1]; /* 지수 */ char zSign [ 1 + 1]; /* 부호 */ char zCmp [ 8 + 1]; /* 대비 */ } DpSysItem_t; /* 입력 */ typedef struct DpSysIn_s { char zGjno [20 + 1]; /* 계좌번호 */ char zCodeNatn [ 3 + 1]; /* 국가코드 */ char zCodeExchng[ 4 + 1]; /* 거래소코드 */ char zJmCd [12 + 1]; /* 종목코드 */ long lTrdQt ; /* 보유수량 */ } DpSysIn_t; /* 출력 */ typedef struct DpSysOut_s { DpSysBaseHdr_t stDpSysBaseHdr; /* 데이터 기본 FORMAT */ DpSysIdx_t stDpSysIdx; /* 지수전문 */ DpSysItem_t stDpSysItem; /* 종목전문 */ } DpSysOut_t; /* DpSys context */ typedef struct DpSys_Context { DpSysIn_t *in; DpSysOut_t *out; FILE *LogFD; /* 공통Log File fd */ } DpSys_Context; /* 지수데이터 생성 */ int CreateIndexData(DpSys_Context *context); /* 지수 데이터 조립 */ char* marshalIdxData(DpSys_Context *context); /* 종목 데이터 조립 */ char* marshalItemData(DpSys_Context *context); /* 종료 */ void ExitProc (DpSys_Context *context); /* 변수선언 */ extern DateTime_st TimeBuf; /* common.c에서 선언 */ EXEC SQL INCLUDE sqlca; EXEC SQL INCLUDE oraca; static DpSys_Context __context; DpSysIn_t __in; DpSysOut_t __out; int main(int argc, char **argv) { // context 선언 DpSys_Context *context = &__context; bzero(context, sizeof(DpSys_Context)); int rtn = 0; /* Log File Open */ if ((context->LogFD = MyLogFileOpen (DP_SYS_LOG)) == NULL) exit (-1); /* 환경화일을 읽음 */ // if (ReadCfg () < 0) // ExitProc (context); // Oracle Connect if (ConnectOracle(context->LogFD) < 0) DisconnectOracle(); rtn = CreateIndexData(context); if (rtn < 0) { PutFmtLog(context->LogFD, "지수데이터 생성 ERR\n"); exit (-1); } // 종료처리 ExitProc (context); } /* 지수데이터 생성 */ int CreateIndexData(DpSys_Context *context) { char sqlbuf[MAX_LEN]; /* fetch할 SQL */ char zIdxDataBuf[IDX_DATA_BUF_TOT_SIZE + 1]; /* 지수데이터 전문버퍼 */ long lFetchCnt = 0; /* 패치카운트 */ memset (sqlbuf, 0x00, sizeof (sqlbuf)); memset (zIdxDataBuf, 0x00, sizeof (zIdxDataBuf)); /* DpSysIdx_t *stDpSysIdx; stDpSysIdx = (DpSysIdx_t *) malloc(sizeof(DpSysIdx_t)); if (stDpSysIdx == NULL) { PutFmtLog(context->LogFD, "지수데이터 버퍼 동적할당 실패 \n"); exit(-1); } */ PutFmtLog(context->LogFD, "지수데이터 조회\n"); strcat(sqlbuf, "SELECT V.DATADIV \n"); strcat(sqlbuf, " ORDER BY IDX_CD \n"); PutFmtLog(context->LogFD, "지수 데이터 조회시작SQL[\n%s\n]\n", sqlbuf); /* 패치처리 */ EXEC SQL PREPARE pre_sql FROM :sqlbuf; PutFmtLog(context->LogFD, "1\n"); EXEC SQL DECLARE CUR_CMSTOCKINDEX CURSOR FOR pre_sql; PutFmtLog(context->LogFD, "2\n"); EXEC SQL OPEN CUR_CMSTOCKINDEX; PutFmtLog(context->LogFD, "3\n"); while(1) { /* OUTPUT 초기화 */ PutFmtLog(context->LogFD, "DpSysIdx_t[%d] DpSysOut_t[%d]\n", sizeof(DpSysIdx_t), sizeof(DpSysOut_t)); <span>memset ((DpSysIdx_t *) &context->out->stDpSysIdx, 0x00, sizeof(DpSysIdx_t)); // memset ((DpSysOut_t *) context->out, 0x00, sizeof(DpSysOut_t)); </span> PutFmtLog(context->LogFD, "3-1\n"); EXEC SQL FETCH CUR_CMSTOCKINDEX INTO :context->out->stDpSysIdx.zDataDiv /* 데이터구분 */ , :context->out->stDpSysIdx.zSysTm /* 시스템시각 */ , :context->out->stDpSysIdx.zIdxCd /* 지수코드 */ , :context->out->stDpSysIdx.zIdxNm /* 지수명 */ , :context->out->stDpSysIdx.zCalTm /* 산출시간 */ , :context->out->stDpSysIdx.zIdx /* 지수 */ , :context->out->stDpSysIdx.zSign /* 부호 */ , :context->out->stDpSysIdx.zCmp; /* 대비 */ PutFmtLog(context->LogFD, "4\n"); // (sqlca.sqlcode!=DB_SUCCESS && sqlca.sqlcode!=DB_NULLDATA) if(sqlca.sqlcode != 0 && sqlca.sqlcode != -1405) { // SQL Error NOT_FOUND if(sqlca.sqlcode == 1403) { // 데이터가 전혀 존재하지 않을 경우 if(lFetchCnt == 0) { PutFmtLog(context->LogFD, "CUR_CMSTOCKINDEX NFD[%d:%s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); //*retcode = 7047; // CUR_CMSTOCKINDEX 조회 오류입니다 } else { // 패치가 끝나고서 정상적인 종료 PutFmtLog(context->LogFD, "CUR_CMSTOCKINDEX Success"); } break; // 정상적으로 while문을 종료 } else { PutFmtLog(context->LogFD, "CUR_CMSTOCKINDEX Fetch Err[%d:%s]\n", sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc); //*retcode = 7047; // CUR_CMSTOCKINDEX 조회 오류입니다 return -1; } } // Fetch Success else { // 패치 카운트 증가 lFetchCnt++; // 지수데이터 marshal strncpy(zIdxDataBuf, marshalIdxData(context), sizeof(zIdxDataBuf)); PutFmtLog(context->LogFD, "[%d] : zIdxDataBuf [%s]\n", lFetchCnt, zIdxDataBuf); // 전문별 전송 } PutFmtLog(context->LogFD, "5\n"); } /* End Of While */ // Cursor close EXEC SQL CLOSE CUR_CMSTOCKINDEX; return 0; } /* 지수 데이터 조립 */ char* marshalIdxData(DpSys_Context *context) { int rtn = 0; char idxDataBuf[IDX_DATA_BUF_TOT_SIZE + 1]; memset(idxDataBuf, 0x00, sizeof(idxDataBuf)); // 전문길이 Set MyItoa (context->out->stDpSysBaseHdr.zDataLen, IDX_DATA_BUF_TOT_SIZE - BASE_HDR_DATA_DIV_SIZE , sizeof(context->out->stDpSysBaseHdr.zDataLen)); // context->out->stDpSysBaseHdr->zDataLen = IDX_DATA_BUF_TOT_SIZE - BASE_HDR_DATA_DIV_SIZE; // 데이터 구분 Set strncpy(context->out->stDpSysBaseHdr.zDataDiv, SEND_MODE, sizeof(context->out->stDpSysBaseHdr.zDataDiv)-1); sprintf(idxDataBuf, "%4.4s%4.4s%1.1s%6.6s%2.2s%20.20s%6.6s%8.8s%1.1s%8.8s" , context->out->stDpSysBaseHdr.zDataLen , context->out->stDpSysBaseHdr.zDataDiv , context->out->stDpSysIdx.zDataDiv , context->out->stDpSysIdx.zSysTm , context->out->stDpSysIdx.zIdxCd , context->out->stDpSysIdx.zIdxNm , context->out->stDpSysIdx.zCalTm , context->out->stDpSysIdx.zIdx , context->out->stDpSysIdx.zSign , context->out->stDpSysIdx.zCmp); PutFmtLog(context->LogFD, "idxDataBuf[%s]\n", idxDataBuf); return idxDataBuf; } /****************************************************************************/ /* 작업종료 */ /****************************************************************************/ void ExitProc (DpSys_Context *context) { // signal (SIGTERM, SIG_IGN); // //PutFmtLog (context->LogFD, (char*)"%s[%d] : ExitProc() Main Process Exit\n", // MyProcName, MainPid); /* Log File Close */ MyLogFileClose (context->LogFD); /* ORACLE DisConnect */ DisconnectOracle(); exit (0); }
Forums:
DpSysIn_t
main() 의 bzero() 바로 다음 줄에,
CreateIndexData() 에서 할당한 stDpSysIdx 는 아무데서도 쓰이지 않는 쓰레기이고...
포인터가 멋져보여서 꼭 사용하고 싶다면
OTL
칼날같은 조언 감사드립니다.
그간에 오류가 말끔히 해결되었습니다. 감사합니다.
오늘 낼 열심히 하면 저도 황금같은 연휴를 ㅋㅋ
추석 잘 보내시기 바랍니다.
( ^^)=b
댓글 달기