2011-01-13 3 views
8

나는 최종 사용자에게 배포하려는 프로그램을 가지고 있으며 이로 인해 충돌 보고서를 받고 싶습니다. MSVC를 사용하고 있다면 미니 덤프를 생성하여 나에게 보낸 다음 해당하는 PDB로 검사하여 유용한 스택 추적을 얻을 수 있습니다.PDB와 동일한 GCC

GCC에서 이와 동일한 작업은 무엇입니까? 스택 트레이스를 생성 할 수 있지만 유용하게 사용하려면 실행 파일에 컴파일 된 디버그 심볼이 필요합니다 (-g 사용). 실행 파일이 크기면에서 꽤 큰 규모가 될 수 있기 때문에 이것은 배포 배포에는 용납 될 수없는 것이 분명합니다.

내가 봤는데 objcopy 디버그 기호를 별도의 파일로 분리 할 수있는 참조를 찾았지만 그 페이지는 여전히 디버그 기호를 사용 가능한 릴리스 실행 파일과 함께 사용할 수 있어야 함을 암시합니다.

답변

5

정확한 답변을 찾을 수 없지만 다음과 같은 대체 솔루션이 있습니다. 최적화 및 기타 릴리스 플래그를 -g와 함께 컴파일하고 어딘가에서 결과 실행 파일을 저장 한 다음 스트립을 사용하여 디버그 기호를 제거하십시오 . 제거 된 실행 파일을 제공하고 스택 추적을 받으면 원래의 unstripped 실행 파일과 함께 addr2line을 사용하면 모든 심볼을 다시 가져와야합니다.

6

잘 생각해 보면 디버그 기호를 추가하기 위해 -g으로 컴파일하지만 프로그램을 느리게 만들 수는 없습니다. 대부분의 프로그램은 -g -O2을 수행하고 objdump으로 디버그 기호를 분리 할 수 ​​있습니다. 그 후에는 디버그 기호가 없으므로 strip 릴리스 빌드를 수행 할 수 있습니다.

업데이트 : 최근 GDB는 예를 들어 당신이

objcopy --only-keep-debug prog prog.debug 
strip prog 

이제 prog 필요가 없습니다 모든 디버그 기호를 덜렁이 수 https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

참조 별도의 디버그 파일을 지원합니다. 하지만 proc.debug 파일을 gdb에서 디버깅 할 수 있습니다.

+0

그게 좋겠지 만, 실제로 읽을 수있는 스택 추적을 얻기 위해 나중에 디버그 기호없이 생성 된 스택 추적을 분리 된 디버그 기호와 어떻게 조율합니까? – pjohansson

+0

gdb가 별도의 디버그 기호를 사용하도록 설정할 수 있습니다. Linux 배포판이 디버그를 사용하는 방법입니다. http://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html – ismail

+2

이 페이지는 마찬가지로 디버깅 정보 오류가있는 컴퓨터에 존재합니다. 나는 분명히 할 것이다. 우리는 고객에게 디버그 정보를 제공 할 수 없다. 소프트웨어가 스택 추적 (디버그 기호 없음)을 생성하고이 스택 추적을 나중에 개발 컴퓨터 중 하나에서 별도의 디버그 기호와 조정하려면 클라이언트에서 더 이상 관여하지 않아도됩니다. 나는 이것이 아마도 * nix가 아닌 Windows 환경이라는 것을 분명히해야한다. – pjohansson