실행 중인 애플리케이션이 "세그먼테이션 오류"로 종료됩니다.

실행 중인 애플리케이션이 "세그먼테이션 오류"로 종료됩니다.

실행 시 예상한 작업을 수행하지 않고 어느 시점에 메시지를 남기는 명령줄 응용 프로그램이 있습니다.

Segmentation fault

무슨 뜻이에요? 어떻게 해야 합니까?

답변1

세그멘테이션 오류메모리 액세스 위반의 결과입니다. 프로그램은 할당된 주소가 아닌 다른 메모리 주소를 참조하고 운영 체제 커널은 SIGSEGV를 사용하여 프로그램을 종료하여 응답합니다.

액세스할 수 없는 메모리에 액세스하려고 시도하는 것은 의미가 없기 때문에 오류가 발생합니다(불가능). 그러나 이러한 유형의 실수는 특히 C 및 C++(많은 일반적인 응용 프로그램을 차지함)와 같은 언어에서 발생하기 쉽습니다. 프로그램 자체나 링크된 라이브러리에 버그가 있음을 나타냅니다. 버그를 보고하려면(이렇게 하세요 - 도움이 됩니다) 다음을 포함하는 것이 좋습니다.역추적세그폴트를 발생시킨 이벤트입니다.

이렇게 하려면 프로그램(GNU 디버거)을 내부적으로 실행하거나 gdb, 설치되어 있지 않은 경우 모든 Linux 배포판(패키지 이름은 "gdb"임)에서 실행할 수 있습니다. 손상된 앱이 "brokenapp"이라고 불리는 경우:

gdb brokenapp

저작권 및 라이센스에 관한 섹션이 나타나고 커서가 있는 프롬프트가 나타납니다.

(gdb) _ 

Enter를 누르고 runEnter를 누르십시오. 매개변수(예 -x --foo=bar whatever: )를 제공해야 하는 경우 이러한 매개변수( run -x --foo=bar whatever)를 추가하세요. 프로그램이 해당 작업을 수행하고 출력을 볼 수 있으며 상호 작용이 필요하면 그렇게 할 수 있습니다(GUI 프로그램을 포함하여 gdb 내에서 모든 종류의 프로그램을 실행할 수 있습니다). 일반적으로 세그폴트가 발생하는 위치에는 다음이 표시됩니다.

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

여기서 출력의 두 번째 줄은 단지 예일 뿐입니다. 이제 bt("backtrace")를 입력하고 Enter를 누르십시오. 더 길 수도 있지만 다음과 같은 내용이 표시됩니다.

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

시간이 길면 한 번에 하나의 화면만 표시되고 메시지가 표시됩니다 --More--. 완료될 때까지 Enter 키를 계속 누르세요. 이제 출력이 quit터미널에 유지됩니다. 모든 내용을 텍스트 파일에 복사 Program received signal SIGSEGV하고 앱의 버그 추적기를 사용하여 버그 보고서를 제출하세요. 예를 들어 "brokenapp bug report"를 검색하여 온라인에서 이 정보를 찾을 수 있습니다. 이메일로 답장을 보내려면 등록해야 할 수도 있습니다. 문제에 대한 설명, 제공한 인수 run등 및 역추적 사본을 포함합니다(긴 경우 버그 추적기 인터페이스에 텍스트 파일을 첨부하는 방법이 있을 수 있습니다). 그것이 무엇인지 알고 있다면( brokenapp --version작동할 수도 있고 매뉴얼 페이지에 얻는 방법이 나와 있을 수도 있음) 버전과 사용 중인 배포판도 포함하세요.

누군가가 곧 당신에게 연락해주기를 바랍니다. 일반적으로 버그를 제출하는 것이 좋습니다.

답변2

이는 응용 프로그램에 버그가 있음을 의미합니다.

  • 최종 사용자인 경우 애플리케이션 공급업체에 문의해야 합니다.

    • Linux 배포판과 함께 제공되는 경우 해당 배포판에 대한 버그 보고서를 작성해야 합니다.
    • 타사의 비상업적 응용 프로그램의 경우 작성자나 해당 응용 프로그램의 버그 추적기에 버그를 보고해야 합니다. 일반적으로 응용 프로그램 사이트를 탐색하거나 바이너리/소스 패키지를 다운로드하여 위치를 찾을 수 있습니다.
    • 상업용 애플리케이션의 경우 지원팀에 문의해야 합니다.
  • 자체 애플리케이션인 경우 다음을 수행할 수 있습니다.

    1. 코어 파일 활성화:$ ulimit -c unlimited
    2. 충돌을 재현하려면:$ ./yourapp
    3. gdb를 사용하여 충돌을 디버깅합니다.$ gdb ./yourapp core

핵심 파일은 귀하 이외의 개발자에게도 매우 유용합니다. 여기에는 충돌 당시 프로그램의 전체 상태가 포함되어 있습니다. 버그 보고서를 제출하는 경우 해당 파일을 첨부하고 경우에 따라 애플리케이션 바이너리도 첨부하세요. 충돌이 발생하는 경우 개인 데이터(예: 계좌 번호, 비밀번호 등)가 프로그램 메모리에 남아 있을 가능성이 높습니다. 대부분의 경우 충돌이 발생한 스레드의 역추적만 보고하면 개발자가 문제를 발견하는 데 큰 도움이 될 수 있습니다. 역추적을 얻으려면 디버거를 사용하여 코어 파일(예 gdb executable corefile: )을 로드할 수 있습니다.

관련 정보