2011-01-14 3 views
11

gcc 컴파일러에서 -g (디버깅 기호)와 -O2 (최상의 안전한 최적화)를 섞어 본 경험이 있습니까?
코어 파일을 다시 보낼 최종 사용자에게 배포 된 릴리스 프로그램의 크래시를 디버깅해야합니다.
는 항상 호출하는 데 사용했습니다gcc에서 -g 및 -O2 옵션 사용

GDB < < myprogram >> < < 코어 파일 >>

과 문제가 어디를 참조하십시오. 이제는 콜 트레이스 만 볼 수 있지만 디버깅 기호가 없으면 문제가 생깁니다.

아이디어가 있으십니까?

답변

6

프로덕션 환경에서 두 가지를 모두 사용하므로 고객이 한 번만 충돌 한 경우 디버깅이 훨씬 쉬워집니다. 문제가있는 곳 (메모리 손상이 아닌 경우)을 알려줍니다.

이론적으로 -g를 추가하면 실행 파일이 커지지 만 실제로 성능에 영향을주지 않습니다. 임베디드 환경에서는 큰 트레이드 오프입니다.

+5

기호가있는 이미지는 디버거에서만 필요합니다. 원격 디버거를 사용하거나 코어 파일에서 사후 디버깅을하는 경우 대상에서 실행중인 이미지에 기호가 제거 될 수 있습니다. –

10

잘 동작합니다.

또는 최적화로 인해 디버거를 단계별로 실행하는 소스가 소스와 정확하게 일치하지 않지만 디버그 기호가있는 IMHO를 사용하면 디버깅이 훨씬 쉬워집니다.

+4

또한 때로는 소스 행이 순서대로 실행되어 처음에 혼란스러워합니다. – mkb

+0

나는이 동작을 디버깅하는 VC 릴리즈 코드에 익숙하다. -g를 선언해도 코드가 모두 똑같이 최적화 되었다면 그냥 방황했습니다. –

+4

'-g' 코드에 아무런 영향도 미치지 않으며 추가 디버깅 데이터가 생성됩니다. –