2011-10-24 3 views
3

은 리눅스 맨드리바차이는

에서 GCC 컴파일러에 버려진 오류 분할 오류 핵심을 제공

int n; 
scanf("%d",n) 

C에 다음 코드를하지만, 다음 코드를 고려 덤프

int *p=NULL; 
*P=8; 

은 세그먼트 오류가 발생합니다. 이유는 무엇입니까?

+2

운영 체제 선택, 가능성이 있습니다. http://stackoverflow.com/questions/775872/why-core-dump-file-is-generated –

+1

글쎄, 실제로 어느 프로그램도 컴파일되지 않습니다. 첫 번째 예제에서 세미콜론이 누락되었습니다. C는 두 번째 예제에서 대소 문자를 구분합니다 (P 대 P). – derobert

답변

0

첫 번째 경우 'n'에는 값이있을 수 있지만이 메모리를 소유하고 있거나 갖고 있지 않을 수도 있습니다. 쓰기가 가능할 수도 있지만 존재하지 않을 수도 있습니다. n이 반드시 0 인 이유는 없습니다.

NULL에 쓰는 것은 분명히 장난 꾸러기이며 OS가 알아 차릴 것입니다!

+0

defintely 같은 unitialized 변수를 사용하여 정의 된 동작이 아닙니다. – derobert

+0

요점은 런타임에서 다른 임의 값으로 쓰는 것보다 0 주소로 쓰는 것을 알아 채기 쉽다는 것입니다. –

+0

하지만 segfault 된 것처럼 분명히주의를 기울였습니다. – derobert

1

동일한 시스템에서 동일한 ulimit -c 설정을 사용한다고 가정하면 (차이점에 대한 내 첫 번째 추측이 될 것임), 옵티마이 저는 가능한 한 명확하게 "주의"합니다 두 번째 예제에서 정의되지 않은 동작 및 자체 exit 생성 objdump -x으로 확인할 수 있습니다.

3

코어 덤프은 프로그램이 충돌 한 시점의 상태 및 메모리 덤프를 포함하는 파일입니다. 코어 덤프는 평범하지 않은 디스크 공간을 차지할 수 있기 때문에 디스크 공간의 크기를 제한 할 수 있습니다. ulimit -c으로 볼 수 있습니다.

이제 세그먼트 화 오류가 발생하면 기본 동작은 프로세스를 종료하고 코어를 덤프하는 것입니다. 프로세스가 세그먼트 오류 신호로 종료되면 Segmentation fault을 인쇄하고 해당 프로세스가 추가로 코어를 덤프 할 경우 (ulimit 설정과 코어 덤프가 생성 될 디렉토리의 사용 권한이 허용되는 경우) 쉘은 어떤 일이 발생했는지 알려줍니다. 그것), 그것은 당신에게 그렇게 말할 것입니다.