GCC -g 대 -g3 GDB 플래그 : 차이점은 무엇입니까?


102

gcc 또는 Clang으로 C 소스 코드를 컴파일 할 때 항상 -g플래그를 사용하여 gdb에 대한 디버깅 정보를 생성합니다.

gcc -g -o helloworld helloworld.c

나는 어떤 사람들이 -g3대신 추천한다는 것을 알았습니다 . 플래그 -g-g3플래그 의 차이점은 무엇입니까 ? 또한 차이가 -g-ggdb?


15
다른 사람의 메이크 파일을 사용하고 있기 때문에 여기에 왔습니다. 문서는 처음부터 시작해야합니다. Google에서 쉬운 답변을 찾으려면 StackOverflow에 대한 좋은 질문입니다.
GreenAsJade 2015 년

당신이 충분히 파고 들기 만한다면 너무나 많은 질문들이 "내 문서를 다루고있다". 그것은 질문을 기각 할 타당한 이유가 아닙니다.
BeeOnRope

답변:


104

로부터 문서 :

-지

운영 체제의 기본 형식 (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을 사용할 때 매크로 확장을 지원합니다.


8
예를 들어 "가장 표현적인 형식"과 "추가 정보"의 차이점을 설명 할 수 있습니까? 이 매개 변수는 상호 보완 적입니까? 많은 사람들이 GDB를 언급합니다 ... 감사합니다!
rogerdpack

28

tl; dr : 특정 질문에 대답하려면 -g3"매크로 정의와 같은 추가 정보를 포함합니다 ... 일부 디버거는 사용할 때 매크로 확장을 지원합니다. -g3"이지만 -g이 추가 정보는 포함되지 않습니다.

더 넓은 대답은 gcc가 -g0(디버그 정보 비활성화 됨)에서 -g3(최대 디버그 정보) 까지 네 가지 수준의 디버그 정보를 지원한다는 것입니다 .

지정 -g-g2. 호기심는 GCC의 문서는 정보가 무엇인지에 대해 거의 말 -g/ -g2포함 또는 제외를 :

디버깅 정보를 요청하고 레벨을 사용하여 정보의 양을 지정하십시오. 기본 수준은 2입니다. 수준 0은 디버그 정보를 전혀 생성하지 않습니다. 따라서 -g0은 -g를 부정합니다.

레벨 1은 디버깅 할 계획이없는 프로그램 부분에서 역 추적을 만들기에 충분한 최소한의 정보를 생성합니다. 여기에는 함수 및 외부 변수에 대한 설명과 줄 번호 테이블이 포함되지만 지역 변수에 대한 정보는 없습니다.

레벨 3에는 프로그램에있는 모든 매크로 정의와 같은 추가 정보가 포함됩니다. 일부 디버거는 -g3을 사용할 때 매크로 확장을 지원합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.