회사동료가 help를 요청하길래 얼마전 이야기했던
MAP파일 생성으로 에러 발생한곳 찾기로 문제가 발생한곳을 찾으려고 했더니...
2005 프로젝트에서 아무리해도 map 파일을 제대로 생성할수 없었다.
포기할수 없어 구글링을 통해 알아보니...
CrashFinder 라는 프로그램을 사용하면 굳이 복잡한 과정을 거치지 않아도 쉽게 알수 있다.
에러가 발생한 곳의 주소를 입력하여 파일명와 에러난 줄번호를 바로 알수있다.
(초간단 사용예는
이곳 참조, 영문doc)
CrashFinder 다운받기추가로 pdb 파일 생성에 관한 Bugs Layer 기사 참조
http://www.microsoft.com/msj/0498/bugslayer0498.aspx글의 요지는...
1. 디버그 심볼은 디버그 빌드에서만 생성할수 있는게 아니다. Release 빌드시도 pdb 생성하여 에러 발생시 심신을 편하게 하자.
설정 방법은...
cl.exe, C++ tab에서
/Zi - Debug Info를 Program Database로 설정
Link.exe, link탭에서
/DEBUG - generate debuginfo 선택
/PDB:"파일명" - user program data base 체크 및 이름추가
2. reversing에 대한 염려도 없다. 프로그램은 약 1kb, pdb 파일이름만 기록
PDB 생성하면서 Release 빌드
PDB 생성하지 않고 Release 빌드
차이점은 NB10으로 시작하는 디버그헤더와 pdb path 만 추가되어있다.
3. dll의 경우 rebase를 통한 로드주소 정리
Debuggin Applications 책에서도 언급되었던 내용으로 상당수의 dll이 0x10000000에 로드되려하기 때문에 이로인한 부하를 줄이기 위해서 dll별 로드되는 주소를 설정.
빌드시 설정하여도 되고 rebase.exe라는 유틸을 사용하여도 무방
4. pdb와 exe 보관
각 버전에 맞는 pdb와 exe를 보관
소스관리툴을 사용하고 파일별 버전을 관리한다면 따로 보관하지 않아도 될듯하다.
결론은...
릴리즈 빌드시 pdb를 생성해서 배포하고(드라이버는 자동으로 pdb가 생성된다) dll은 시작주소를 기본값(0x10000000)이 아닌 다른 값(Debugging Application 책에 권장방법이 있다)으로 설정한다.
에러발생시 Windbg를 사용할 여건이 안된다면 CrashFinder로 분석하고 여건이 허락한다면 Windbg를 통해 분석하자.
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다
-
Tracked from 잡동사니
2008/05/05 06:33
삭제
회사동료가 help를 요청하길래 얼마전 이야기했던 MAP파일 생성으로 에러 발생한곳 찾기로 문제가 발생한곳을 찾으려고 했더니...2005 프로젝트에서 아무리해도 map 파일을 제대로 생성할수 없었..
관리자만 볼 수 있는 댓글입니다.