본문 바로가기
Programming/C C++

Segmentation Fault 세그멘테이션 오류 (Core dump)

by whitele 2021. 7. 5.
반응형

 

 

 

Segmentaiton Fault 세그멘테이션 오류

 흔히 포인터 관련 오류로 쉽게 접하고 사실은 메모리 관련 오류이다. 흔히 리눅스, 유닉스 계열에서 프로그래밍을 하다 보면 (Segmentaion Fault) 세그멘테이션 오류(Core dumped)라는 오류를 종종 보았을 것이다. 이는 메모리 보호 기법에 의해 발생한 오류로 허가되지 않은 메모리의 접근을 방지하기 위해서이다. MS의 윈도우에서는 예외처리를 하여 다양한 오류 상황에 대처하도록 설계되어있다. 그러나 UNIX 계열에는 단지 허가되지 않은 메모리의 접근을 에러 처리할 뿐이다. 그래서 오류를 찾기도 조금 더 어렵고 어디서 발생했는지 모르는 경우도 발생한다. 메모리 관리가 프로그래머에게 주어진 C/C++에서 발생한다. core dump는 메모리가 놓아졌다 이런 의미를 가지는데 코어 덤프라 불리는 이유는 컴퓨터 초창기에 메모리를 주로 코어라고 지칭했기에 그렇다.

 

메모리 관리

 세그멘테이션 오류는 메모리 관리로 인한 오류이다. 때문에 이에 관해서 생각해 볼 필요가 있다. 운영체제에서는 프로세스 별 메모리를 할당하고 침범하지 못하게 관리한다. 메모리 관리 기법으로 프로그램 자체가 메모리 관리를 할 수 도있으나 보통은 운영체제가 관리한다. 이러한 메모리 관리를 통해 메모리 침범으로 인한 비정상적인 작동을 방지하고 해킹 등을 방지할 수 있다. 그러나 이러한 보호 기법에도 우회할 수 있는 기법이 존재한다.

 

오류 발생 원인

  • 보호된 메모리에 접근 할때
  • 읽기 권한이 없는 프로세스가 읽거나 쓰려고 할 때
  • 할당된 메모리 이외 메모리에 접근할 때

프로그래밍 경우 발생 예

  • pointer로 할당되지 않거나 잘못된 메모리로 접근한 경우
  • 할당된 것보다 많은 문자를 입력한 경우 (주로 포인터를 사용하다 발생)
  • 잘못된 자료형 형식 포맷 스트링을 사용할 경우

정확한 원인은 코드 자체에 있다. 메모리 접근을 잘못한 경우로 코드 문법 자체는 오류가 없어 찾기가 어려워 디버깅 도구를 이용하여 디버깅을 통해 오류를 고쳐야 한다.

 이러한 오류는 컴파일 단계에서 잡아내지 못하기 때문에  지나치는 경우가 많다. 실행 중 적절치 못한 메모리 관리로 인한 오류가 대부분이다. 윈도우에서는 런타임 오류로 UNIX/LINUX에서는 흔히 세그먼테이션 오류로 실행이 중지되는 까닭이 운영체제에서 메모리 침법으로 인한 강제 중지를 하기 때문이다. 

#include <stdio.h>
#include <unistd.h>
int main()
{
	char buf[8];
	read(0,buf,256);
	
	return 0;
}

스택 침범

위 코드는 8byte의 공간에 최대 256까지 읽을 수 있는 read 함수를 통해 8byte를 넘는 아무 문자를 입력하여 오류를 발생시킨 코드이다.

 

 

 

 

 

728x90
반응형

'Programming > C C++' 카테고리의 다른 글

C/C++ 메모리 복사 memcpy 함수  (0) 2021.07.16
C/C++ memset() 함수  (0) 2021.07.11
스레드와 C언어 스레드 pthread  (0) 2021.06.19
C++ STL map 컨테이너  (2) 2021.06.09
C++ STL Set 컨테이너,멤버 함수 사용  (2) 2021.06.05

댓글