Almost-Native

Pro*C 프로그램에서 Segmentation fault (core dumped) Error 본문

Java 프로그램 개발, IT

Pro*C 프로그램에서 Segmentation fault (core dumped) Error

2023. 1. 21. 13:15

오라클 Pro*C 프로그램에서 컴파일 후 실행할때 아래와 같이 Core Dump 에러가 발생하는 경우가 있습니다.

 

$ make -f aaa1.mk
proc aaa1 INCLUDE=include/ include=/u02/app/oracle/product/19.12.0/dbhome_1/precomp/public/ include=/u02/app/oracle/product/19.12.0/dbhome_1/rdbms/demo/ include=/u02/app/oracle/product/19.12.0/dbhome_1/rdbms/public/ include=/u02/app/oracle/product/19.12.0/dbhome_1/network/public/  PARSE=NONE RELEASE_CURSOR=YES MODE=ANSI

Pro*C/C++: Release 19.0.0.0.0 - Production on Sat Jan 21 13:04:40 2023
Version 19.12.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

System default option values taken from: /u02/app/oracle/product/19.12.0/dbhome_1/precomp/admin/pcscfg.cfg

gcc -c -o aaa1.o aaa1.c -I include/ -I/u02/app/oracle/product/19.12.0/dbhome_1/precomp/public/ -I/u02/app/oracle/product/19.12.0/dbhome_1/rdbms/demo/ -I/u02/app/oracle/product/19.12.0/dbhome_1/rdbms/public/ -I/u02/app/oracle/product/19.12.0/dbhome_1/network/public/  -ansi
gcc -o aaa1 aaa1.o -L/u02/app/oracle/product/19.12.0/dbhome_1/lib -lclntsh
$
$
$ aaa1
-----------------------------------
Segmentation fault (core dumped)
$
$

 

이거 원인을 찾느라 아주 많이 오랜시간 구글링을 하고 헤맸는데, 결국은 엉뚱한데서 답을 찾게되어 또 헤매는 일 없으라고 여기에 적어 둡니다.

 

아래는 EMP 테이블에서 데이터를 조회하는 Dynamic SQL 샘플 Pro*C 프로그램입니다.

 

$ cat aaa1.pc
#include <stdio.h>
#include <stdlib.h>

EXEC SQL INCLUDE SQLCA;

EXEC SQL BEGIN DECLARE SECTION;
    char userid[40]= "scott/tiger";
    char    stmt[1000];
    char    ret1[50];
    long    ret2, ret3;
EXEC SQL END DECLARE SECTION;

main(void)
{

    EXEC SQL CONNECT :userid;

    sprintf(stmt,
        "select job, sum(sal) as ret2, sum(sal) over() as ret3 \n"
        "from EMP \n"
        "group by job, sal \n"
        );

    EXEC SQL PREPARE SEL_PRE FROM :stmt;
    if (sqlca.sqlcode != 0) {
        fprintf(stdout, "prepare error(%d) stmt (%s)n", sqlca.sqlcode, stmt);
        return(sqlca.sqlcode);
    }

    EXEC SQL DECLARE C1 CURSOR FOR SEL_PRE;

    EXEC SQL OPEN C1;
    if (sqlca.sqlcode != 0) {
        fprintf(stdout, "cursor open error(%d)n", sqlca.sqlcode);
        return(sqlca.sqlcode);
    }

    printf("\n-----------------------------------\n");
    EXEC SQL WHENEVER NOT FOUND DO break;
    while (1) {
        EXEC SQL FETCH C1 INTO :ret1, :ret2, :ret3;
        printf("%s\t\t%s\t\t%s\n", ret1, ret2, ret3);
    }
    printf("-----------------------------------\n");

    EXEC SQL CLOSE C1;

    EXEC SQL COMMIT WORK RELEASE;
    exit(0);
}

$

 

얼핏보면 잘못된게 없어 보이는데, 잘 보면 printf() 함수에서 포맷을 잘못 지정한 것을 확인할 수 있습니다.

ret2, ret3 변수는 long 타입이라 %d 와 같은 포맷을 써야 하는데, String 타입에 해당하는 %s 를 썼습니다.

아주 사소한 실수인데, Core Dump 와 같은 살벌한 에러를 만났네요.

결국은 이 Core Dump 에러는 Pro*C 문제는 아니었고, 단순히 C Programming 관련 문제였습니다.

 

Comments