본문 바로가기
Major/Programming

릴리즈모드 에러 잡기

by 알 수 없는 사용자 2008. 6. 15.
반응형
<릴리즈 버젼 실행시 런타임 에러 찾아내기>

릴리즈 버젼 실행시 에러가 났을 경우..참 곤란했죠.
물론 고수님들께서야 이미 알고계시겠지만..
나름대로 엄청 가슴이 아팠습니다. 디버그모드는 괜찮은데..릴리즈는 에러를 때리구..
어디서 나는지조차 모르겠구...그때 쓸만한 잼있는 방법입니다.(물론 모르는 분에 한해서..^^)
 
Step 1.
프로젝트 세팅 들어가면..
Link라는 탭 선택해서..보면
Generate Mapfile이라구 있을꺼랍니다.
고걸 선택해서 샥 돌려보면..map파일이 release디렉토리에 생기죠.

Step 2.
그리구 나선..에러를 만들어 돌려보고, 어느 주소에서 에러가 났는지 캡춰
그리구서 map파일에 있는 주소랑 매치해 보는겁니다.
그럼 어느 함수에서 에러가 났는지 알 수 있죠~ 
 
끝.


 Re: 릴리즈 버전 디버깅하기... 전상연 / jof4002  
     

<요약> 어플리케이션을 릴리즈 모드로 Build 할 때 디버깅 정보를 남기어서 VC++ Debugging Tool에서 디버
깅을 가능하게 합니다.
이 방법을 사용하는 경우, 실제 릴리즈 실행 파일은 거의 영향을 받지 않으면서,
디버그에서 브레이크 포인터를 잡거나, Trace를 가능하게 하므로,
릴리즈모드 에서만 발생하는 버그를 잡을수 있습니다.

<추가정보>
 이 방법을 사용하게 되면 _DEBUG free define으로 포함되는 디버깅 메크로는 포함되지 않으나,
Source code안으로 Step in 가능하게 하는 디버깅 정보들은 OBJ와 PDB 파일에 남게 됩니다.
 이를 이용하게 되면 VC++ IDE 환경에서 source level 까지의 step in이 가능해 집니다.

<방법>
1. Project를 open한뒤 menu "Project/Settings"를 선택
2. "Settings For"를 "Win32 Release"로 선택
3. "C/C++" tab에서 "category"를 "General"로 선택

    "Program Database"로 선택
4. "Link" tab에서 "category"를 General"로 선택

    "Generate debug info"를 체크
5. "Rebuild All"를 실행하여서 프로그램을 다시 빌드


이제 디버깅 하고자 하는 위치에 브레이크포인터를 잡고 "Go"를 실행하면,
디버깅을 진행할수 있습니다.

===========================================================================================

물론 이렇게 했을때는 안 죽는다면 올려주신 방법으로 확인해야겠죠.

  Re: [우슥] 그것만으로는 부족합니다. 서우석 / seaousak  
       

저기 그냥 Generage Mapfile 만 선택하시면 그다지 유용한 정보를 얻을 수 없습니다.

링크탭의 밑에 보시면 "Project optios" 라고 입력창이 있는데,

거기다가 "/MAPINFO:EXPORTS /MAPINFO:LINES" 를 추가해야 합니다.

이 작업은 Visual Basic에서도 마찬가지로 적용될 수 있습니다.

그리고, 제가 해보니까 C/C++ 탭에서 Debug info 도 포함해야 하는것 같더군요..

(기억이 가물가물..)

마지막으로 생성된 map 파일에서 소스 찾는 방법은

다음과 같습니다.

1. 에러난 파일의 이름을 찾는다.
2. 에러난 주소를 확인한다.
3. 우선 pre referenced load address를 보구, public function의 주소의 사이에 에러난 주소가 있는지 확
인한다.
4. 에러난 주소보다 큰 가장 가까운 Rva + Base 주소를 찾는다.
5. 주소를 찾았으면 만약, 함수의 이름이 ? 로 시작할 경우 UNDNAME.exe 을 사용하여 함수의 정확한 이름
을 구한다.
6. 다음의 계산법에 의해 맵파일의 밑부분에 있는 곳에서 가장 근접한 작은 값을 찾는다.
 계산법 : (에러 주소) - (preferred load address) - 0x1000(EXE 파일 헤더값입니다.)

그럼.
 Re: MFC.map 는 있지만.... 다른 멥파일이 없을때에는 어떻게 하지요? 채경석 / kyuseo  
  

좋은 글 잘보았습니다.

그런데 MFC.map 은 있지만.... 다른 멥파일이 없을때에는 어떻게 하지요?

at address 0x6c3cd7ab  와 같이 다른 DLL 의 에러주소를 가지고 어떻게 찾을 방법은 없나요??

혹시 MFC.MAP 을 제외한 다른 MAP 파일을 가지고 계신분있음 올려주시면 감사하겠습니다.
반응형

댓글