gcc 또는 Clang으로 C 소스 코드를 컴파일 할 때 항상 -g
플래그를 사용하여 gdb에 대한 디버깅 정보를 생성합니다.
gcc -g -o helloworld helloworld.c
나는 어떤 사람들이 -g3
대신 추천한다는 것을 알았습니다 . 플래그 -g
와 -g3
플래그 의 차이점은 무엇입니까 ? 또한 차이가 -g
및 -ggdb
?
답변
로부터 문서 :
-지
운영 체제의 기본 형식 (stabs, COFF, XCOFF 또는 DWARF 2)으로 디버깅 정보를 생성합니다. GDB는이 디버깅 정보로 작업 할 수 있습니다. stabs 형식을 사용하는 대부분의 시스템에서 -g는 GDB 만 사용할 수있는 추가 디버깅 정보를 사용할 수 있도록합니다. 이 추가 정보로 인해 GDB에서 디버깅이 더 잘 작동하지만 다른 디버거가 충돌하거나 프로그램 읽기를 거부 할 수 있습니다. 추가 정보 생성 여부를 제어하려면 -gstabs +, -gstabs, -gxcoff +, -gxcoff 또는 -gvms를 사용하십시오 (아래 참조).
…
-ggdb
GDB에서 사용할 디버깅 정보를 생성합니다. 즉, 가능한 경우 GDB 확장을 포함하여 가장 표현적인 형식 (DWARF 2, stab 또는 지원되지 않는 경우 기본 형식)을 사용합니다.
-gvmslevel
디버깅 정보를 요청하고 레벨을 사용하여 정보의 양을 지정하십시오. 기본 수준은 2입니다. 수준 0은 디버그 정보를 전혀 생성하지 않습니다. 따라서 -g0은 -g를 부정합니다.
….
레벨 3에는 프로그램에있는 모든 매크로 정의와 같은 추가 정보가 포함됩니다. 일부 디버거는 -g3을 사용할 때 매크로 확장을 지원합니다.
답변
tl; dr : 특정 질문에 대답하려면 -g3
“매크로 정의와 같은 추가 정보를 포함합니다 … 일부 디버거는 사용할 때 매크로 확장을 지원합니다. -g3
“이지만 -g
이 추가 정보는 포함되지 않습니다.
더 넓은 대답은 gcc가 -g0
(디버그 정보 비활성화 됨)에서 -g3
(최대 디버그 정보) 까지 네 가지 수준의 디버그 정보를 지원한다는 것입니다 .
지정 -g
은 -g2
. 호기심는 GCC의 문서는 정보가 무엇인지에 대해 거의 말 -g
/ -g2
포함 또는 제외를 :
디버깅 정보를 요청하고 레벨을 사용하여 정보의 양을 지정하십시오. 기본 수준은 2입니다. 수준 0은 디버그 정보를 전혀 생성하지 않습니다. 따라서 -g0은 -g를 부정합니다.
레벨 1은 디버깅 할 계획이없는 프로그램 부분에서 역 추적을 만들기에 충분한 최소한의 정보를 생성합니다. 여기에는 함수 및 외부 변수에 대한 설명과 줄 번호 테이블이 포함되지만 지역 변수에 대한 정보는 없습니다.
레벨 3에는 프로그램에있는 모든 매크로 정의와 같은 추가 정보가 포함됩니다. 일부 디버거는 -g3을 사용할 때 매크로 확장을 지원합니다.