최근 GCC 4.8의 설명서가 업데이트되어 새로운 최적화 스위치 인 -Og
이 도입되었습니다. 이GCC 4.8 : -Og는 -g를 의미합니까?
[..]는 적절한 수준의 런타임 성능을 제공하면서 빠른 컴파일 및 우수한 디버깅 환경에 대한 필요성을 해결합니다. 전반적인 개발 경험은 기본 최적화 수준 -O0보다 우수해야합니다.
이 스위치는 -g
을 의미 하는가 아니면 수동으로 CXXFLAGS
에 추가해야합니까?
최근 GCC 4.8의 설명서가 업데이트되어 새로운 최적화 스위치 인 -Og
이 도입되었습니다. 이GCC 4.8 : -Og는 -g를 의미합니까?
[..]는 적절한 수준의 런타임 성능을 제공하면서 빠른 컴파일 및 우수한 디버깅 환경에 대한 필요성을 해결합니다. 전반적인 개발 경험은 기본 최적화 수준 -O0보다 우수해야합니다.
이 스위치는 -g
을 의미 하는가 아니면 수동으로 CXXFLAGS
에 추가해야합니까?
짧은 대답 : 아니요, 수동으로 -g
을 수동으로 추가해야합니다.
긴 대답는 :
나는 소스로부터 직접 하드 답을 찾기 위해 분투, 그래서 여기에 설명 된 방법을 사용하여 자신을 테스트하기로 결정 How to check if program was compiled with debug symbols?
나는 함께 실행 파일을 내장 -O3
플래그가없고 -g
없이 objdump --syms <file> | grep debug
을 사용하면 예상대로 아무 것도 산출되지 않았습니다.
그런 다음 최적화 플래그없이 -g
과 함께 실행 파일을 만들었습니다.
0000000000000000 l d .debug_info 0000000000000000 .debug_info
내가 마지막으로 -Og
플래그 및 -g
없이 실행 파일을 내장 : 같은 objdump
명령은이 6 개 개의 결과를 얻었다. objdump
명령은 아무것도 산출하지 않았습니다. 즉,이 경우 디버그 기호는 이 아니고이 아닙니다. 내가 GCC 자체에서 명시 적 문서를 찾을 수는 없지만 -Og
이 -g
을 의미하지 않는다는 것을
는 (마르코 Scannadinari으로 앞서 언급 한대로) Gentoo Wiki 내 주장을 확인합니다.
(GCC/opts.c가) -Og
이 -O1
과 동일하지만 것을 보여 GCC 4.9.2 소스 코드에서 보면 일부 플래그는 나쁜 디버깅 경험을 초래할 수있는 비활성화로 :
/* in function default_options_optimization: */
case OPT_Og:
/* -Og selects optimization level 1. */
opts->x_optimize_size = 0;
opts->x_optimize = 1;
opts->x_optimize_fast = 0;
opts->x_optimize_debug = 1;
break;
몇 단계 후, maybe_default_option
함수를 호출하고 x_optimize_debug
플래그를 사용하여 호출합니다. 을 사용하면 OPT_LEVELS_1_PLUS_NOT_DEBUG
, OPT_LEVELS_1_PLUS_SPEED_ONLY
및 OPT_LEVELS_2_PLUS_SPEED_ONLY
으로 표시된 옵션을 사용할 수 없습니다.
이렇게하면 "~ O0보다 좋다"라는 문구가 나타납니다. -Og
은 -O0
과 -O1
사이에 있습니다. 이 옵션은 -g
옵션을 통해 활성화 될 수있는 디버깅 정보를 포함시키는 데 영향을 미치지 않습니다. 당신은 아마 또한 다른 -g
옵션에 관심이있을 것입니다 :
-ggdb
무시 -g
.즉, -g
이후에 -ggdb
을 설정하면 -g
옵션이 실제로 무시됩니다.-g
은 -g2
이고, -g
을 생략하면 -g0
과 같습니다.-g3
은 -g2
보다 큰 디버깅 섹션을 생성하므로 을 -ggdb2
과 비교하여 더 큰 디버깅 섹션을 생성합니다.-O0
< -O1
< -Og
< -O2
< -O3
).strip --strip-debug
은 -g
레벨과 관계없이 동일한 개체 크기를 나타냅니다. 이는 -O
레벨 만 실제 코드에 영향을 미치므로 -g
이 디버그 섹션을 결정한다는 기대치와 일치했습니다.strip --keep-debug
은 크기가 -g
수준이며 그 다음에 -O
수준이 우세한 개체가됩니다. (따라서 -g0 -O3
은 -g3 -O0
보다 작음).참고 : 여기서 컴파일 시간을 고려하지 않았습니다. 보다 적극적인 최적화 수준으로 증가 할 가능성이 높습니다. 디버그 레벨은 (최적화에 비해) 시간에 미미한 영향을 미칠 것이라고 기대할 수 있습니다. 이는 단지 패스 중에 추가 세부 사항을 추적해야한다는 것을 의미하기 때문입니다. 여기
내가 실제 동작을 테스트하는 데 사용되는 명령입니다 (또한-ggdbX
대신
-gX
의 비교) :
for g in -g0 -g2 -g3;do
for O in -O0 -O1 -O2 -O3 -Og; do
flags="$g $O";
gcc -fPIC -rdynamic -c -Wall -Wextra -Ilib ltunify.c -o obj/gL_"${flags// /_}_.o" $flags || break;
done;
done
짧은 대답은 '예입니다. – January
외관상으로는 "-Og는 -g를 암시하지 않는다. 단지 디버깅을 방해 할 수있는 최적화를 비활성화한다." - Gentoo wiki –
gcc에서 발췌 한 두 문장 중 하나를 증명할 수있는 게 좋을까요? 답변으로 게시 된 경우 동의하고 upvote. – cschwan