CrashFinder
2008/02/13 10:10
회사동료가 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를 통해 분석하자.
2008/02/13 10:10 2008/02/13 10:10
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  1. Subject: CrashFinder 사용법

    Tracked from 잡동사니 2008/05/05 06:33  삭제

    회사동료가 help를 요청하길래 얼마전 이야기했던 MAP파일 생성으로 에러 발생한곳 찾기로 문제가 발생한곳을 찾으려고 했더니...2005 프로젝트에서 아무리해도 map 파일을 제대로 생성할수 없었..

  • Woof 2008/02/13 10:47  댓글주소  수정/삭제  댓글쓰기
    VS2005 에서 일반 Applicatin의 map 파일 생성은 프로젝트의 속성의 linker 옵션 내의 debugging 탭에서 Amp Exports를 yes로 주거나 /MAPINFO:EXPORTS로 옵션을 주시면 만들어져요. (Geneate Map File 이라는 탭도 있네요.) 맵 만드는게 문제가 아니라 만들어진 맵이 이상하다는 것이려나. 하는 생각이 들지만. :|
    툴이랑 그런 부분은 한번 써봐야겠네요. 잘 봤습니다아. :)
    • hongyver 2008/02/14 08:37  댓글주소  수정/삭제
      아...그런가요?
      몇번 해보다 안되서 구글링 했더니...CrashFinder라는게 눈에 띄더라구요. 그래서 그냥 귀차니즘으로 ^^