실행중인 응용 프로그램은 "세그먼트 오류"로 끝납니다.


답변:


62

세그먼트 오류는 메모리 액세스 위반의 결과입니다. 프로그램은 할당 된 것 이외의 메모리 주소를 참조했으며 OS 커널은 SIGSEGV로 프로그램을 종료하여 응답합니다.

액세스 할 수없는 메모리에 액세스하려는 시도가 없으므로 수행 할 수없는 실수입니다. 그러나 이러한 종류의 실수는 특히 C 및 C ++와 같은 언어 (많은 일반적인 응용 프로그램을 설명)에서 쉽게 만들 수 있습니다. 프로그램 자체 또는 링크 된 라이브러리의 버그를 나타냅니다. 버그를보고하려면 (이것이 도움이 됨), 세그먼트 오류를 ​​일으킨 이벤트 의 역 추적 을 포함시키는 것이 좋습니다 .

이 작업을 수행하기 위해 내부 gdb에서 GNU GNU 디버거 프로그램을 실행할 수 있습니다 . GNU 디버거는 아직 설치되지 않은 경우 모든 Linux 배포판에서 사용할 수 있습니다 (패키지는 "gdb"라고 함). 손상된 응용 프로그램의 이름이 "brokenapp"인 경우 :

gdb brokenapp

저작권 및 라이센스에 관한 단락이 나타나고 마지막에 커서와 함께 프롬프트가 표시됩니다.

(gdb) _ 

입력 run하고 Enter를 누르십시오. 인수를 제공해야하는 경우 (예 -x --foo=bar whatever:) 추가하십시오 ( run -x --foo=bar whatever). 프로그램이 수행하는 작업을 수행하고 출력을 볼 수 있으며 상호 작용이 필요한 경우 gdb 내부에서 GUI 프로그램을 포함한 모든 종류의 프로그램을 실행할 수 있습니다. 그것이 일반적으로 segfaults 지점에서 볼 수 있습니다 :

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작동하거나 매뉴얼 페이지에서이를 얻는 방법을 나타낼 수 있음).

누군가가 오래지 않아 다시 연락을 드릴 것입니다. 버그 신고는 일반적으로 감사합니다.


1
세그먼테이션 오류는 인터프리터 언어에서도 발생할 수 있습니다 (대부분 인터프리터 자체의 버그로 인해 발생 함)
Braiam

이것은 매우 유용합니다! 안으로 들어갈 가능성이 있습니까? 정지 표시를하고 자세한 내용을 찾으려고합니까?
Zloy Smiertniy

1
@ZloySmiertniy gdb많은 일을 합니다. 당신은 섹션 5.1
goldilocks

11

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

  • 최종 사용자 인 경우 응용 프로그램 공급 업체에 문의해야합니다.

    • Linux 배포판과 함께 제공된 경우 해당 배포판에 대한 버그 보고서를 작성해야합니다.
    • 타사의 비상업적 앱의 경우 버그를 작성자 나이 특정 응용 프로그램 버그 추적기에보고해야합니다. 일반적으로 응용 프로그램 사이트를 찾아 보거나 바이너리 / 소스 패키지를 다운로드하여 장소를 찾을 수 있습니다.
    • 상업용 앱의 경우 지원 부서에 문의해야합니다.
  • 자신의 응용 프로그램 인 경우 다음을 수행 할 수 있습니다.

    1. 핵심 파일을 활성화하십시오. $ ulimit -c unlimited
    2. 충돌을 재현하십시오. $ ./yourapp
    3. gdb로 디버그 충돌 : $ gdb ./yourapp core

코어 파일은 또한 본인 이외의 개발자에게 매우 유용합니다. 충돌이 발생한 시점에 프로그램의 전체 상태를 포함합니다. 버그 보고서를 제출하려는 경우, 버그를 첨부하고 경우에 따라 앱 바이너리를 첨부하십시오. 충돌시 계정 번호, 비밀번호 등의 개인 데이터가 프로그램의 메모리에 남아있을 가능성이 적습니다. 대부분의 경우 크래시 된 스레드의 역 추적 만보고하면 개발자가 문제를 찾는 데 큰 도움이됩니다. 역 추적을 얻으려면 디버거 (예 :)를 사용하여 코어 파일을로드 할 수 gdb executable corefile있습니다.


Microsoft의 대화 상자에 따르면 "문제가 지속되면"공급 업체에만 문의해야하며, 그렇지 않으면 귀찮게하지 마십시오. 드문 충돌은 실제 버그가 아니며 재현 가능한 버그 일뿐입니다.
Kaz

4
필자는 Microsoft 소프트웨어의 품질이 UNIX 소프트웨어와 비교하여 많은 경우에 낮으며 UNIX 세계 사람들이 일반적으로 지침을 참조하지 않는 것이 좋습니다.
gena2x
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.