Happy to visit my research note ^^

Segmentation fault & core dumped 본문

프로젝트 개발 및 ERROR 해결

Segmentation fault & core dumped

Liam Lim 2023. 4. 6. 23:33
728x90

  linux상에서 kernel programming을 하던 중 core dumped error가 발생하여 이번 게시물을 작성하게 되었다.

 

 

 


Segmentation Fault


 

 

 

  먼저, segmentation fault는 program이 memory에 접근할 때 잘못된 영역에 접근하려고 할 때 발생한다. 예로는 :

  1. Pointer Issue : 잘못된 pointer를 사용해서 읽거나 쓸 때 발생한다. 예를 들어, NULL pointer를 참조하거나 이미 해제된 memory에 접근하는 경우가 있다.
  2. Array Issue : 배열의 범위를 벗어난 index로 접근하거나, 배열을 선언하지 않은 pointer로 접근할 때 발생한다.
  3. Stack Overflow : 함수 호출 시 stack frame이 너무 많이 쌓이면 stack memory를 넘어서는 경우 발생한다.
  4. memory lack : dynamic memory allocation시에 memory lack로 인한 할당 실패, 혹은 system resource가 부족한 상황에서 memory를 할당하려고 할 때 발생한다.
  5. shared memory issue : multiple processor가 공유하는 memory 영역에서 충돌이 발생해서 segmentation fault가 발생할 수 있다.

 

  3번의 stack overflow에 대해 좀더 자세히 설명하자면, stack overflow는 program에서 stack memory 영역을 넘어서게 되는 상황을 말한다. stack은 함수 호출 시 local variable과 함수 호출 정보를 저장하는 memory 영역으로 사용되고, stack memory에는 제한된 크기의 data만 저장이 가능하다. 만약 stack에 저장될 data의 크기가 stack memory의 크기를 초과하게 되면 또한 stack overflow가 발생하게 된다.

  stack overflow는 주로 recursive function call 시에 발생하거나, local variable의 과도한 선언으로 인해 발생한다. 예로는 :

int factorial(int n) {
  if (n == 0) {
    return 1;
  }
  return n * factorial(n - 1);
}

int main() {
  int result = factorial(10000);
  printf("%d\n", result);
  return 0;
}

  이 함수는 factorial을 계산하는 함수로, 매우 큰 값인 10000을 인자로 받는다. 하지만 이 재귀 함수는 호출 시마다 stack에 새로운 frame을 생성하게 되므로, depth가 너무 길어지면 stack overflow가 발생할 수 있다.

  또 다른 예로는 :

void func() {
  char buffer[100];
  gets(buffer);
  printf("%s\n", buffer);
}

int main() {
  func();
  return 0;
}

  이 코드는 gets function을 사용하여 입력된 문자열을 buffer 배열에 저장하고 출력한다. 그러나 gets 함수는 입력된 문자열의 길이를 검사하지 않기 때문에, 입력 문자열이 buffer 배열의 크기를 초과하면 stack overflow가 발생할 수 있다.

  stack overflow는 보안 취약점으로 이용될 수 있기 때문에, programmer는 이러한 오류를 방지하기 위해 stack의 크기와 사용법에 대해 잘 이해하는 것이 필요하다.

 

 

 


Core Dumped


 

 

 

  " Core dumped"는 program이 비정상적으로 종료되어서, memory dump file을 생성하는 것을 의미한다. 이 메시지는 주로 linux나 unix operating system에서 발생하며, program이 segmentation fault 등의 비정상적인 동작으로 인해 종료되었을 때 자동으로 생성된다.

  여기서 segmentation fault와 core dumped의 차이는 segmentation fault는 program이 memory 영역에 잘못된 접근을 시도하여 segmentation fault가 발생했음을 나타내는 오류 메시지이고, core dumped는 이러한 비정상적인 종료로 인해 memory dump file이 생성되었음을 나타내는 메시지이다.

 

  core dumped file은 process의 memory 상태를 file로 저장한 것을 말한다. 이 File은 보통 현재 작업 directory에서 "core"라는 이름으로 생성된다. 만약 "core" File이 생성되지 않았으면, 아래 명령어를 통해서 core file 생성을 허용해주면 된다.

$ ulimit -c unlimited

 

 

728x90
Comments