[C 언어] 세그멘테이션 오류(Segmentation Fault)란?

유선·2024년 4월 10일
1

CS

목록 보기
2/25
post-thumbnail

열받는 segmentation fault... ㅠㅠㅠㅠ

Segmentation Fault란?

  • 주로 Unix 및 Unix 계열 운영체제에서 발생한다.
    - 즉, Linux, macOS, 그리고 다른 Unix 기반 시스템에서 이 오류를 자주 볼 수 있다.
  • C나 C++에서 Segmentation Fault 오류가 발생한다.
    - 이 두 언어가 포인터와 배열을 사용하여 메모리에 직접적으로 접근할 수 있는 기능을 제공하기 때문이다.
    - 즉, 메모리 관리를 프로그래머에게 주어지기 때문이다.
  • 메모리에 접근하려고 할 때 허용되지 않는 메모리 영역을 접근하려고 시도할 때 발생하는 오류이다.
    - NULL인 경우
    - 메모리를 동적 할당할 때, 할당받지 않은 메모리에 접근할 경우

🙋‍♀️ NULL이란??

  • C 언어에서 NULL은 포인터 변수가 어떠한 객체나 메모리 주소를 가리키지 않음을 나타내는 값이다.
  • "아무 것도 가리키지 않는다"는 말이다.
  • C 언어에서 NULL은 일반적으로 정수 0으로 정의
    -> 포인터가 '정수'를 가리키는 것은 C 언어의 타입 시스템에 위배된다.
    -> C 언어에서 포인터는 메모리 주소를 저장하는 변수로, 이 메모리 주소가 가리키는 것은 프로그램의 데이터나 코드가 저장된 메모리 위치
int *ptr = NULL; // int *ptr = 0; 와 같은 말이다.
printf("%d", *ptr); 이걸 실행하는 순간 비정상 종료된다.

발생하는 경우의 수

  • 잘못된 포인터 참조: 포인터를 잘못 사용하여 유효하지 않은 메모리 주소에 접근할 때 발생할 수 있습니다.
  • 배열 인덱스 오류: 배열의 인덱스를 벗어나는 위치에 접근할 때 발생할 수 있습니다.
  • 메모리 누수: 동적으로 할당된 메모리를 해제하지 않고 계속해서 사용할 때 발생할 수 있습니다.
  • 스택 오버플로우: 스택 메모리를 너무 많이 사용하여 스택 영역을 벗어나는 경우 발생할 수 있습니다.

Segmentation Fault(core dump)?

  • 프로그램이 세그멘테이션 오류로 인해 비정상적으로 종료되면서 발생하는 상황을 가리킨다.
  • 이러한 오류가 발생하면 프로그램이 실행 중지되고 종료된다.

core dump란?

  • 프로그램이 Segmentation Fault 오류를 발생시키면 종종 시스템은 프로그램의 상태를 포함한 "core dump" 파일을 생성한다.
    - 이 파일은 프로그램이 어디에서 오류가 발생했는지, 프로그램이 실행 중에 어떤 상태였는지 등을 확인하는 데 도움을 준다.
  • 프로그램이 종료될 때 메모리의 내용을 포함한 프로그램 상태를 보존하는 것을 말한다.
    - 디버깅 목적으로 사용
  • core dump 파일은 디버깅 도구를 사용하여 분석할 수 있으며, 오류를 식별하고 해결하는 데 도움이 된다.
  • 디버깅을 통해 어떤 상황에서 Segmentation Fault가 발생했는지 추적하고, 이를 수정하여 프로그램의 안정성을 향상시킬 수 있다.

core dump 생성 위치?

  • 보통 Unix 및 Unix 계열 시스템에서는 core dump 파일이 실행되는 디렉토리에 생성된다.
  • 이 파일은 종종 "core"라는 이름을 가지며, 프로그램의 실행 파일과 같은 디렉토리에 저장된다.
    - 그러나, 리눅스 시스템에서는 기본적으로 코어 덤프(Core Dump) 파일이 생성되지 않도록 설정되어 있을 수 있다.
  • 사이즈가 0이상 이어야한다.
  • ulimit -a
  • 코어 덤프 파일이 생성되도록 설정하려면, ulimit 명령을 사용하여 코어 덤프 파일 크기 제한을 해제하고, 코어 덤프 파일 생성을 허용할 수 있다.
  • ulimit -c unlimited

요약

Segmentation fault는 주로 NULL인 메모리나 할당 받지 않은 메모리에 접근할 때 주로 발생하니,
C나 C++에서는 포인터를 이용해서 코딩을 하는일이 잦은데 포인터를 통해 잘못된 메모리에 접근하지 않도록 주의한다.

참고자료

[리눅스] COREDUMP 파일이 보이지 않을때 해결하는 두가지 방법
코어 덤프 분석하기
Linux Core를 덤프 위치로 설정

profile
Sunny Day!

0개의 댓글