2009-04-26 3 views
6

저는 GDB의 초보자입니다. 제대로 작동하고 있습니다. 그러나, 이것이 큰 프로젝트에서 어떻게 사용되는지 궁금합니다. 나는 makefile과 g ++를 사용하여 빌드가 끝난 프로젝트를 가지고있다. GDB가 작동하려면, 오른쪽에있는 디버그 심볼로 컴파일해야합니다 (g ++ -g 파일)?gdb를 이용한 디버깅 - 우수 사례

  1. 질문은 내가 디버그 빌드 같은 메이크업 디버그 할 수 있도록, "디버그"와 같은 메이크 뭔가 새로운 목표를 작성해야합니까. 이것이 최선의 방법입니까?

  2. foo.cpp 만 디버깅해야하며 main을 포함한 전체 프로그램을 빌드하는 것 이외의 디버그 심볼을 생성 할 수 있습니까?

의견이 있으십니까?

답변

2
  1. 은 당신도 등) 코드를 시도하고 최적화 된 디버그 (-O1, -O2해야 할 수도 있습니다, 필요하지, 떠나지 않을 이유 - 에 g? 릴리스의 경우, 당신은 언제나 바이너리에 스트립을 실행할 수 있습니다.

  2. 예. -g로 그냥 파일을 빌드합니다. 내가 큰 차이가 사이에 있다고 생각하지 않습니다

+0

"릴리스의 경우, 항상 바이너리에서 strip을 실행할 수 있습니다." 설명 할 수 있니? –

+0

http://www.sourceware.org/binutils/docs-2.16/binutils/strip.html -g를 사용하면 코드가없는 경우보다 코드가 다소 커집니다. 쉽게 디버깅 기호를 추가 할 수는 없지만 스트립으로 쉽게 제거 할 수 있습니다. – Mikeage

0

gdb는 기호없이 작동합니다. 출력이 훨씬 덜 유용하다는 것입니다.

  1. 환경 설정에 문제가 있습니다. 디버그 모드에서는 기본적으로 모든 것을 빌드하고, 필요한 경우 을 릴리스으로 만듭니다.
  2. 예. 가끔 -g (건물 항상 고려할 수 있지만
1

대규모, 중형 또는 소형 프로젝트에서 gdb 사용. 그러나 큰 프로젝트의 경우 요 디버깅 정보가 객체 및 실행 파일의 크기를 증가시키기 때문에 빌드에 필요한 공간을 고려해야합니다.

  1. 전체 솔루션을 디버깅해야 할 필요성을 처음에 과소 평가하는 경우 향후 결정이 어려울 수 있습니다. 빌드가 디버깅 정보의 유무와 관계없이 수행 될 수있는 경우 항상 유용하므로 빌드 스크립트를 신중하게 작성하십시오.
  2. 예, 이전 질문에 대한 답을 생각해보십시오. 가끔 디버깅 정보가없는 모듈에서 문제가 발생할 수 있습니다. 나는 우리가 항상 가능한 가장 자세한 디버깅 정보와 함께 구축 작업을 여기에 대형 프로젝트에서
2

(같은 GDB에서 매크로에 액세스하기위한 네이티브 GDB 형식 또는 '-gdwarf-2 파라메터 -g3'에 대한 '-ggdb3').

디버깅이 끝나면 'strip'명령을 사용하여 바이너리에서 모든 디버깅 정보를 제거합니다.

gcc -ggdb3 blah.c -o blah 
strip blah 
0

당신은 항상 디버그 버전의 어딘가에 저장 할 수 있습니다, 그리고 당신이 이제까지해야하는 경우 심볼 정보, 당신이 제거/릴리스 버전을 디버깅 후, 당신은 단지 "파일/경로를"갈 수 gdb를 다시 결합 그 대상에 대한 심볼을 다시 읽습니다. 또한 "symbol-file/path"를 사용하여 제거 된 파일에 바인딩 할 심볼 정보를 구성 할 수 있습니다.