무슨 뜻인가요?
AU : 세그먼테이션 결함이란 무엇입니까?를 참조하십시오 . 그리고 이것도 그것을 재현하는 몇 가지 예를 가지고 있습니다. SO : 세그먼테이션 결함이란 무엇입니까? . 내가 올 수있는 가장 간단한 설명 (완벽하지 않을 수도 있음) :
프로그램이 자체 섹션 외부의 메모리 영역에 액세스하려고했습니다. OS가 차단합니다.
경우에 따라 초기화 포인터로 값 읽기, 배열에서 범위를 벗어남, 함수 호출 (이전 호환성이 유지되지 않는 경우), ...
그러나 큰 프로그램이나 다른 프로젝트 라이브러리에서 릴레이되는 원인을 찾는 것이 항상 쉬운 것은 아닙니다. 그리고 대부분의 경우 대상 프로그램 또는 종속성 (업스트림 프로젝트 또는 다운 스트림 배포 패키지)에 대한 버그 보고서가 나타납니다.
이 문제를 어떻게 해결할 수 있습니까?
사용자 정의 구성 / 설정을하지 않고 모든 업데이트가 설치되어있는 경우 버그 보고서 를 실행하십시오 . 버그를 어떻게보고합니까?를 참조하십시오 .
Ubuntu에서 지원하는 오픈 소스 인 경우 ubuntu-bug( apport-bug)를 사용 하십시오. 타사 비공개 소스의 경우 도움말 페이지에서 버그를보고하고 관련 데이터를 수집하는 방법을 확인하십시오.
참고 : 프로그래밍 배경이 조금이라도없는 경우 직접 해결하기 위해 최선을 다하는 것이 좋습니다. 몇 년 동안 많은 버그 리포트가 비활성 상태입니다. 또는 문제를보고하기 전에 최소한 디버그 데이터를 수집하여 문제를 해결하십시오.
디버깅에 유용한 도구
apport-bug 로그 / 코어 덤프 / 역 추적
세그먼테이션 오류 전에 오류 메시지가없는 경우 --save옵션으로 실행하고 역 추적 로그를 찾으십시오.
apport-bug program-cmd --save bug-report_output.txt
gdb 역 추적 / 디버깅 소스 코드
작동하지 않으면 gdb다음을 사용하십시오 .
$ gdb program-cmd
(gdb) run
(gdb) backtrace
오류 메시지가 표시되면 비슷한 경우 웹, 런치 패드 및 업스트림 프로젝트 버그 추적기를 확인하십시오.
일부 고급 사용자 또는 ac / c ++ 학습 경로를 따르는 사용자의 경우 해당 -dbg기호 패키지를 다운로드 할 수 있습니다. 그런 다음 gdb소스를 통한 프로그램 흐름을 추적하고 런타임 오류를 발생시키는 정확한 기능 / 명령을 얻는 데 사용할 수 있습니다 .
strace 시스템 콜 추적
도움이 될 수있는 또 다른 도구는 strace마음에 듭니다. 정말 강력한 도구입니다.
그것은 스스로를 제시한다 :
가장 간단한 경우 strace에는 종료 될 때까지 지정된 명령을 실행하십시오. 프로세스에 의해 호출 된 시스템 호출과 프로세스에 의해 수신 된 신호를 가로 채서 기록합니다. 각 시스템 호출의 이름, 인수 및 리턴 값은 표준 오류 또는 -o 옵션으로 지정된 파일에 인쇄됩니다.
strace유용한 진단, 교육 및 디버깅 도구입니다. 시스템 관리자, 진단 전문가 및 문제 해결사는 소스를 추적하기 위해 다시 컴파일 할 필요가 없기 때문에 소스를 즉시 사용할 수없는 프로그램의 문제를 해결하는 데 매우 유용합니다. 학생, 해커 및 지나치게 호기심 많은 사람들은 일반적인 프로그램을 추적하여 시스템 및 시스템 호출에 대해 많은 것을 배울 수 있습니다. 또한 프로그래머는 시스템 호출 및 신호가 사용자 / 커널 인터페이스에서 발생하는 이벤트이므로이 경계를 면밀히 조사하면 버그 격리, 온 전성 검사 및 경쟁 조건 캡처에 매우 유용합니다.
출처: man strace
ltrace 동적 라이브러리 호출 추적
ltrace지정된 명령이 종료 될 때까지 단순히 지정된 명령을 실행하는 프로그램입니다. 실행 된 프로세스에 의해 호출 된 동적 라이브러리 호출과 해당 프로세스에 의해 수신 된 신호를 인터셉트하고 기록합니다. 또한 프로그램에서 실행 된 시스템 호출을 가로 채서 인쇄 할 수 있습니다.
사용법은 strace(1) 과 매우 유사합니다 .
출처: man ltrace