[완료] 구조체 memset시 코어덤프 현상입니다.

gennaio의 이미지

아래 소스에서 굵게 표시된 부분에서 구조체 멤셋시에 코어덤프가 나서 끝나버리네요.

아직 초보인지라 요게 쉽게 풀리지가 않네요.. 힌트주시면 정말 열심히 해볼게요.

사정상 소스 해독에 필요가 없는 부분은 줄였으니 이해부탁드립니다.

그리고 만약에

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);
}
bushi의 이미지

DpSysIn_t   __in;
DpSysOut_t  __out;
static DpSys_Context __context = {
      .in = &__in,
      .out = &__out,
};
안되겠군요. main() 에서 bzero()를 해버리니.
main() 의 bzero() 바로 다음 줄에,
context->in = &__in;
context->out = &__out;

CreateIndexData() 에서 할당한 stDpSysIdx 는 아무데서도 쓰이지 않는 쓰레기이고...

포인터가 멋져보여서 꼭 사용하고 싶다면

DpSysIdx_t  *sysidx;
 
sysidx = &context->out->stDpSysIdx;
처럼 하시고 sysidx->zDataDiv 로 접근하세요.

OTL

gennaio의 이미지

그간에 오류가 말끔히 해결되었습니다. 감사합니다.

오늘 낼 열심히 하면 저도 황금같은 연휴를 ㅋㅋ

추석 잘 보내시기 바랍니다.

( ^^)=b

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.