인디애나대학교 Indiana University Indiana University

이 페이지에는:

  • 개요
  • 의 예에는 일반적인 segfaults
  • 알아의 범위를 배열을 참조
  • 체크인 쉘 한계
  • 사용하여 디버거를 진단하 segfaults

개요

구분류(aka 세그멘테이션)일반적인 원인이 되는 조건 프로그램을 충돌; 그들은 종종 파일과 관련된 라는core. Segfaults 는 불법 메모리 위치를 읽거나 쓰려고하는 프로그램에 의해 발생합니다.

프로그램 메모리로 나누어 서로 다른 세그먼트는 텍스트 세그먼트를 위한 프로그램 지침,데이터에 대한 세그먼트 변수와 배열에서 정의 컴파일 시간,스 세그먼트를 위한 임시(또는 자동)에 정의된 변수 서브루틴과 기능과 힙 세그먼트를 위한 변수를 할당하는 동안 런타임 기능으로,같은malloc(C)그리고allocate(에서 사용가능). 자세한 내용은 프로그램 세그먼트 정보를 참조하십시오.

한 세그멘테이션할 때 발생하는 변수에 대한 참조를 벗어나 세그먼트는 변수가 있는 경우 또는 작성하려고 시도했는 위치에 읽기 전용 세그먼트입니다. 실제로,segfaults 은 거의 항상 인도하 읽거나 쓰는 존재하지 않는 배열 요소로 정의하는 포인터를 사용하기 전에,또는(C)프로그램 실수로 사용하여 변수의 값으로 주소(보scanf래 예제 참조).

의 예에는 일반적인 segfaults

  • 예를 들어,전화memset()
    memset((char *)0x0, 1, 100);
  • 다음과 같은 세 가지 사례를 설명하는 대부분의 일반적인 유형의 배열 관련 segfaults:

    경우

    /* "Array out of bounds" error valid indices for array foo are 0, 1, ... 999 */ int foo; for (int i = 0; i <= 1000 ; i++) foo = i;

    경우 B

    /* Illegal memory access if value of n is not in the range 0, 1, ... 999 */ int n; int foo; for (int i = 0; i < n ; i++) foo = i;

    경우 C

    /* Illegal memory access because no memory is allocated for foo2 */ float *foo, *foo2; foo = (float*)malloc(1000); foo2 = 1.0;

    • 는 경우,배열fooindex = 0,1, 2, ... 999forfoofoo가 있는 메모리 세그먼트 외부에 있으면 segfault 가 발생합니다. Segfault 가 발생하지 않더라도 여전히 버그입니다.
    • 경우 b,정수 n 임의의 임의의 값일 수 있습니다. Case A 와 같이0, 1, ... 999범위에 없으면 segfault 가 발생할 수 있습니다. 그것이 있든 없든,그것은 확실히 버그입니다.
    • 경우에는 C,메모리의 할당한 변수를foo2foo2foo2에 액세스하면 segfault 가 발생할 가능성이 큽니다.
  • 또 다른 일반적인 프로그래밍 오류가 이르는 segfaults 은 감독의 사용에서 포인터입니다. 예를 들어,C 함수scanf()
    int foo = 0; scanf("%d", foo); /* Note missing & sign ; correct usage would have been &foo */

    variablefoo10000foo.

  • 세그멘테이션이 발생할 경우 프로그램도 운영하는 메모리 위치는 허용되지 않는(예를 들어,을 쓰려고 시도하고 읽기 전에 위치한 결과에서 세그멘테이션).
  • 프로그램에 스택 공간이 부족할 때 Segfaults 가 발생할 수도 있습니다. 이되지 않을 수 있습 버그에서 귀하의 프로그램,지로 인해 수 있습니다 대신하여 귀하의 설정 쉘 스택 크기 제한을 너무 작습니다.

찾는 범위를 벗어나 배열을 참조

대부분 프로그램 컴파일러 옵션이 있는 코드를 삽입하는 범위 검사에서 모든 배열을 참고 있습니다. 액세스가 배열에 대해 정의 된 인덱스 범위를 벗어나면 프로그램이 중단되어 어디에서 발생하는지 알려줍니다. 대부분의 프로그램 컴파일러 옵션은-C-check뒤에 키워드를 사용합니다. 정확한 옵션을 얻으려면 컴파일러의 사용 설명서를 참조하십시오. 프로그램 속도가 느려지므로 디버깅 할 때만 경계 검사를 사용하십시오. 일부 C 컴파일러에는 경계 검사 옵션도 있습니다.

체크인 쉘 한계

으로 주목에서는 마지막 예를 들어,위의 일부 세그멘테이션 문제가 프로그램의 버그를하지만,해 발생하는 대신 시스템 메모리에 의해 제한되는 설정이 너무 낮습니다. 일반적으로 이러한 종류의 문제를 일으키는 스택 크기에 대한 제한입니다. 을 확인하는 메모리 한계는 사용하는ulimitbashkshlimitcshtcsh. Stacksize 를 높게 설정 한 다음 프로그램을 다시 실행하여 segfault 가 사라지는 지 확인하십시오.

디버거를 사용하여 segfaults 진단

다른 방법으로 문제를 찾을 수없는 경우 디버거를 시도 할 수 있습니다. 예를 들어,사용할 수 있습 GNU 의 잘 알려진 디버거GDBcorecoregdb corebacktrace명령하시는 프로그램이었다면 그것은 충돌했습니다. 이 간단한 트릭을 사용하면 코드의 해당 부분에 집중할 수 있습니다.

사용하는 경우에는backtracecoreg 파일을 찾지 못한 문제해야 할 수 있습 프로그램을 실행하는 디버거에서 컨트롤한 다음 단계로 코드를 통해 하나의 기능,또는 하나의 소스 코드 라인,니다. 이를 위해,당신은 코드를 컴파일 할 필요가 없이 최적화,그리고-g플래그,그래서에 대한 정보 소스 코드 라인에 포함되는 실행 파일입니다. 자세한 내용은 Emacs 내에서 Gdb 를 사용하여 C orC++프로그램을 디버깅하는 단계별 예제를 참조하십시오.

관련 문서

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다