명령어 - linux core dump path



코어 덤프 파일이 생성되는 이유는 무엇입니까? (5)

때때로 코드를 실행할 때 Ctrl + \로 프로그램을 종료하면 코어 덤프 파일이 생성됩니다. 파일 이름은 core.* 형식 core.* . 프로그램이 갑자기 종료되지 않고 세그먼트 화 오류가 없습니다. 나는 이것이 SIGQUIT 가 아니라 SIGABRT 또는 SIGSEGV 라고 믿습니다. Ctrl + C 또는 Ctrl + Z를 시도하면 생성되지 않습니다.

Ctrl + \ 를 누른 경우에만 생성 된 이유를 누구나 알 수 있습니까? 이 코어 덤프 파일이 생성되지 않도록하려면 어떻게해야합니까? 코어 덤프 된 파일을 사용할 수 있습니까?


그것은 잘못 행동하는 응용 프로그램을 디버깅하는 데 도움이되는 도구입니다. 그것은 죽은 시간에 모든 응용 프로그램의 실제 메모리 내용과 모든 스레드의 레지스터 상태 및 스택을 포함하기 때문에 크기가 큽니다.

이들은 커널이 세그먼트 위반이나 버스 오류를 생성하는 것과 같은 악의적 인 행동을하는 응용 프로그램을 죽일 때 생성됩니다.


충돌하지 않는 코드를 작성하여 코어 덤프 파일을 만드는 것을 피할 수 있습니다. :)

심각하게, 코어 덤프는 "사후 사후"디버깅을 위해 프로그램의 상태를 볼 수 있기 때문에 유용합니다. gdb에서 열 수 있으며 (특히 디버깅을 사용하여 빌드 된 경우) 프로그램의 상태를 검사 할 수 있습니다.

코어 덤프는 일반적으로 프로그램에 SIGSEGV (대개 유효하지 않은 포인터 역 참조로 인해 발생), SIGABRT (abort ()를 호출 한 경우에 발생 함) 또는 C ++에서 소멸자의 예외에 대한 기본 terminate 다른 결함. 또한 디버거를 사용하여 명시 적으로 또는 프로그래밍 방식으로 트리거 할 수 있습니다.

모든 버그를 수정했는데 완벽하면 버그를 삭제할 수 있습니다. 또한, 어떤 식 으로든 프로그램을 변경했다면 (그리고 다시 컴파일 한 경우) 디버그 정보가 이제 코어 덤프와 일치하지 않으므로 쓸모 없게됩니다. 따라서 삭제할 수도 있습니다.


프로세스가 SIGSEGV와 같은 특정 신호를 받으면 코어 덤프가 생성됩니다. SIGSEGV는 커널이 주소 공간 외부의 메모리에 액세스 할 때 커널이 보내는 신호를 보냅니다. 일반적으로 포인터가 사용되는 방식의 오류로 인해 발생합니다. 즉, 프로그램에 버그가 있음을 의미합니다.

코어 덤프는 버그를 찾는 데 유용합니다. 문제가 발생했을 때 프로세스의 메모리 이미지이므로 gdb와 같은 디버거를 사용하여 프로그램이 수행 한 작업을 볼 수 있습니다. 디버거는 심지어 프로그램의 변수 값에 액세스 할 수도 있습니다.

ulimit 명령을 사용하여 코어 덤프가 발생하지 않도록 할 수 있습니다.


프로세스의 오류로 인해 운영 체제가 프로세스를 종료 할 때 프로세스가 코어를 덤프합니다. 이것이 발생하는 가장 일반적인 이유는 프로그램이 잘못된 포인터 값에 액세스했기 때문입니다. 산발적 인 덤프를 감안할 때 초기화되지 않은 포인터를 사용하고있을 가능성이 큽니다.

오류의 원인이되는 코드를 게시 할 수 있습니까? 모호한 일반화 외에도 실제로 코드를 보지 않고 무엇이 잘못되었는지를 추측하기는 어렵습니다.

코어 덤프가 실제로 무엇인지에 관해서는 위키 백과 문서를 확인하십시오.


ctrl + \ 는 시그널 SIGQUIT를 프로세스에 보낸다. POSIX.1 표준에 따르면이 신호의 기본 동작은 코어를 생성하는 것입니다.

SIGILL, SIGABRT, SIGFPE, SIGSEGV는 시스템이 코어를 생성하는 다른 경우입니다.

자세한 내용은 시스템의 "man 7 신호"를 참조하십시오.





coredump