답변:
세그먼트 오류는 메모리 액세스 위반의 결과입니다. 프로그램은 할당 된 것 이외의 메모리 주소를 참조했으며 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
작동하거나 매뉴얼 페이지에서이를 얻는 방법을 나타낼 수 있음).
누군가가 오래지 않아 다시 연락을 드릴 것입니다. 버그 신고는 일반적으로 감사합니다.
gdb
는 많은 일을 합니다. 당신은 섹션 5.1
이것은 응용 프로그램에 버그가 있음을 의미합니다.
최종 사용자 인 경우 응용 프로그램 공급 업체에 문의해야합니다.
자신의 응용 프로그램 인 경우 다음을 수행 할 수 있습니다.
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
코어 파일은 또한 본인 이외의 개발자에게 매우 유용합니다. 충돌이 발생한 시점에 프로그램의 전체 상태를 포함합니다. 버그 보고서를 제출하려는 경우, 버그를 첨부하고 경우에 따라 앱 바이너리를 첨부하십시오. 충돌시 계정 번호, 비밀번호 등의 개인 데이터가 프로그램의 메모리에 남아있을 가능성이 적습니다. 대부분의 경우 크래시 된 스레드의 역 추적 만보고하면 개발자가 문제를 찾는 데 큰 도움이됩니다. 역 추적을 얻으려면 디버거 (예 :)를 사용하여 코어 파일을로드 할 수 gdb executable corefile
있습니다.