debian 계열 linux에서 core 파일 생성 방법

1. core 파일을 최소 크기를 설정 한다. 

 $ ulimit -c unlimited 
 $ ulimit -a 

 2. core 파일의 네이밍 룰을 지정한다. 

 $ echo "/etc/core" > /proc/sys/kernel/core_pattern 

> login 시 마다 동일한 설정을 해야 한다. 

[ 참조 ] 
http://kthan.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4Linux-ulimit-%EC%9C%BC%EB%A1%9C-coredump-%EC%84%A4%EC%A0%95 
http://manywaypark.tistory.com/entry/core-file%EC%9D%80-%EC%96%B4%EB%94%94%EC%97%90


core 파일이 생성되는 한가지 상황

오늘 하루종일 삽질한 내용이 있어서 기록을 남긴다.

[ 상황 ]
패킷 내용이 추가되어서 기존 모듈을 수정하게 되었다.
컴파일을 잘되는데, 실행하면 계속 core 파일이 생성되면서 프로세스가 죽는다.
수정 한 부분을 전체 주석으로 막아도, Call Stack을 체크 해보면 특정 함수를 진입하는 시점에 죽어 버린다.

[ 원인 ]
원인은 패킷 사이즈가 커지면서, Stack 영역에 할당 할 수 있는 최대 메모리 사이즈를 초과한 것이다.

[ 해결 방안 ]
Stack 영역이 아닌, Heap영역에 메모리를 할당 하면 된다.

원인 밝히느라 오전 내내 삽질, 
정적 메모리 구조를 동적 구조로 바꾸느라고, 오후 내내 디버깅 및 삽질..
오늘 하루도 이렇게 날려 먹었다.

[ Code ]
-. Stack 영역에 할당 할 수 있는 최대 크기 확인 ( 단위 KB )

$ ulimit -s
 8192



-. 테스트 프로그램.

// cc -o maxsize maxsize.c
#include <stdio.h>

typedef char PACKET[5600000];

int main()
{
        PACKET pkt;
        //PACKET pkt2;  
        PACKET *pkt3;

        printf ("\n");
        printf ( "%s: %d\n", "PACKET", sizeof(PACKET) );

        memset ( &pkt, 0, sizeof(pkt) );
        //memset ( &pkt2, 0, sizeof(pkt2) );   // rise core dump  

        pkt3 = (PACKET*)malloc(sizeof(PACKET));
        if ( !pkt3 ) printf("not enough momery\n");
        else memset( pkt3, 0, sizeof(PACKET) );

        return 0;
}

실행 해 보면,  아래와 같은 결과를 얻는다.

$ maxsize
PACKET: 5600000



 하지만, 9, 16 라인의 주석을 풀고 실행해보면, 아래와 같이 core 파일이 생성된다.

$ maxsize
세그멘테이션 결함(Segmentation Fault)(코어 덤프)


[ 참고문서 ]
http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/stack_size 


 

core 파일 분석


- 생성 정보 확인
$ file core


- callstack 정보 확인
$ pstack core


- 전체 메모리 맵 확인
$ pmap core


- 시그널 정보 확인
$ pflags core


- core 발생 Lib 확인
$ mdb core
>
$C
> $q


- 링크한 동적 Lib 확인
$ pldd core


- process id: effective, real, saved (u/g) 확인
$ pcred core


sun 장비에서 확인 한 내용입니다.