2011-03-11 6 views
2

내 프로그램에서 SIGSEGV 신호를받을 때 어떻게 코어를 덤프 할 수 있습니까? (내 프로그램을 실행하는 서버에는 사용 권한이 매우 제한되어 있으므로 기본적으로 코어 덤프가 사용되지 않습니다.)SIGSEGV 인 경우 코어 덤프 (C)?

gcore를 사용하여 다음을 작성했지만 대신 C 함수를 사용하고 싶습니다. 어떻게 든 코어를 잡고 어딘가에 폴더에 쓸 수 있습니까?


void segfaulthandler(int parameter) 
{ 
    char gcore[50]; 
    sprintf(gcore, "gcore -s -c \"core\" %u", getpid()); 
    system(gcore); 

    exit(1); 
} 

int main(void) 
{ 
    signal(SIGSEGV, segfaulthandler); 
} 

답변

1

리눅스에서, 일반적으로 수행 할 수 있습니다

 
$ ulimit -c unlimited 

신호가 수신 될 때 그 결과 코어 파일은 프로세스의 현재 작업 디렉토리에 기록됩니다.

+0

코어 파일은'/ proc/sys/kernel/core_pattern'의 값을 사용하여 현재 작업 디렉토리를 기반으로 생성됩니다 - 기본값은 단순히 "core" – Erik

+0

또한/proc/sys/kernel/core_uses_pid '를 1로 설정할 수 있습니다.이 경우 .pid가 코어 파일 이름에 추가됩니다 (패턴에 % p가 포함되어 있지 않은 경우) – Erik

3

어려운 제한이없는 한 setrlimit(RLIMIT_CORE, ...)을 사용하여 softlimit를 높이고 코어 덤프를 활성화 할 수 있습니다. 이는 쉘에서 ulimit -c을 실행하는 것과 같습니다.

관련 문제