오늘 하루종일 삽질한 내용이 있어서 기록을 남긴다.
[ 상황 ]
패킷 내용이 추가되어서 기존 모듈을 수정하게 되었다.
컴파일을 잘되는데, 실행하면 계속 core 파일이 생성되면서 프로세스가 죽는다.
수정 한 부분을 전체 주석으로 막아도, Call Stack을 체크 해보면 특정 함수를 진입하는 시점에 죽어 버린다.
[ 원인 ]
원인은 패킷 사이즈가 커지면서, Stack 영역에 할당 할 수 있는 최대 메모리 사이즈를 초과한 것이다.
[ 해결 방안 ]
Stack 영역이 아닌, Heap영역에 메모리를 할당 하면 된다.
원인 밝히느라 오전 내내 삽질,
정적 메모리 구조를 동적 구조로 바꾸느라고, 오후 내내 디버깅 및 삽질..
오늘 하루도 이렇게 날려 먹었다.
[ Code ]
-. Stack 영역에 할당 할 수 있는 최대 크기 확인 ( 단위 KB )
-. 테스트 프로그램.
실행 해 보면, 아래와 같은 결과를 얻는다.
하지만, 9, 16 라인의 주석을 풀고 실행해보면, 아래와 같이 core 파일이 생성된다.
[ 참고문서 ]
http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/stack_size
[ 상황 ]
패킷 내용이 추가되어서 기존 모듈을 수정하게 되었다.
컴파일을 잘되는데, 실행하면 계속 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
반응형
'Dev > C, C++' 카테고리의 다른 글
debian 계열 linux에서 core 파일 생성 방법 (0) | 2015.07.30 |
---|---|
Serial-port 관련 자료 정리 (0) | 2014.08.29 |
Pro*C/C++ Precompiler Programmer's Guide (0) | 2009.03.13 |
한글이 포함된 문자열을 특정 byte로 자르기 (0) | 2009.02.16 |
DisplayHex (0) | 2008.11.13 |