문제

세그먼트 화 결함의 줄 번호를 줄 수있는 GCC 옵션이 있습니까?

나는 내가 할 수 있다는 것을 안다 :

  1. 라인별로 디버그
  2. 코드에 printfs를 좁히십시오.

편집 :

  1. bt / where GDB에서 스택을주지 마십시오.
  2. 유용한 제안
도움이 되었습니까?

해결책

GCC 옵션을 모르지만 GDB로 응용 프로그램을 실행할 수 있고 충돌하면 유형을 입력해야합니다. where 종료했을 때 스택을 살펴 보려면 닫을 수 있습니다.

$ gdb blah
(gdb) run
(gdb) where

완전성 편집 :

또한 사용에 대한 디버그 플래그로 응용 프로그램을 구축해야합니다. -g 실행 파일에 줄 번호를 포함하는 GCC 옵션.

또 다른 옵션은 bt (백트레이스) 명령.

다른 팁

다음은 완전한 쉘/GDB 세션입니다

$ gcc -ggdb myproj.c
$ gdb a.out
gdb> run --some-option=foo --other-option=bar
(gdb will say your program hit a segfault)
gdb> bt
(gdb prints a stack trace)
gdb> q
[are you sure, your program is still running]? y
$ emacs myproj.c # heh, I know what the error is now...

행복한 해킹 :-)

Java 및 기타 친근한 언어가 NULL 포인터 예외를 처리하는 방법과 유사한 프로그램이 SEGV 신호를받을 때 GCC가 스택 트레이스를 인쇄 할 수 있습니다. 자세한 내용은 여기에서 내 대답을 참조하십시오.

이것에 대한 좋은 점은 코드에 남겨 둘 수 있다는 것입니다. 멋진 디버그 출력을 얻으려면 GDB를 통해 물건을 실행할 필요가 없습니다.

-G로 컴파일하고 지침을 따르면 명령 줄 도구를 사용할 수 있습니다. addr2line 출력에서 파일/라인 정보를 얻으려면

Valgrind 아래에서 실행하십시오.

또한 -G에서 디버그 플래그로 빌드해야합니다.

GDB로 코어 덤프를 열 수도 있습니다 (그래도 -g 필요).

디버깅 (-G)으로 컴파일하고 디버거 (GDB, Run, BT)에서 실행하기위한 모든 이전 제안이 다음과 같은 경우 :

  • 초등학교 : 디버거 아래에서 실행되지 않을 수도 있고, 사후 코어 덤프를 분석하려고합니다. (디버그 세션을 시작하지만 프로그램을 실행하지 않거나 종료 된 경우 배경을 요청할 때 GDB는 "스택 없음"이라고 말합니다. "run"을 입력하려면.) segfault가있는 경우 세 번째 인수를 추가하는 것을 잊지 마십시오 (core) GDB를 실행할 때, 그렇지 않으면 특정 프로세스 나 메모리 이미지에 첨부되지 않은 동일한 상태에서 시작합니다.
  • 어려운 : 프로그램이 실제로 실행 중이지만 GDB가 "스택 없음"이라고 말하는 경우 스택 포인터가 심하게 부서 질 것입니다. 이 경우 어딘가에 버퍼 오버플로 문제가 될 수 있으며, 런타임 상태를 완전히 으깨기에 충분히 심각 할 수 있습니다. GCC 4.1은 -fstack-protector-all. 패치와 함께 GCC 3.X에 추가 할 수 있습니다.

GCC 가이 정보를 제공하는 방법은 없으므로 GDB와 같은 외부 프로그램에 의존해야합니다.

GDB는 프로그램이 결함이 발생한 후 "BT"( "BackTrace") 명령으로 충돌이 발생한 줄을 제공 할 수 있습니다. 이렇게하면 충돌 라인뿐만 아니라 프로그램의 전체 스택을 제공합니다 (따라서 충돌이 발생한 기능을 볼 수 있습니다).

그만큼 No stack 프로그램이 성공적으로 종료 될 때 문제가 발생하는 것 같습니다.

레코드의 경우 코드에서 반환을 잊어 버렸기 때문에이 문제가 발생하여 프로그램을 실패 코드로 종료했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top