C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[886] [Exception] 예외처리2 - AccessViolation발생시 에러위치 찾기
장성호 [nasilso] 12949 읽음    2009-04-22 23:56

AccessViolation발생위치 찾기



프로그램에서 다음과 같이 AccessViolation이 발생하는 경우를 누구나 겪어 보셨을것입니다.

문론 AccessViolation이 발생하지 않도록 프로그램해야하지만,
예기치 못한 상황에서 AccessViolation이 발생한경우 어떻게 처리하십니까?

위 에러메시지를 이용하여 예외가 발생한 소스 위치를 찾아 보도록 하겠습니다.

 

맵파일 만들기

먼저 프로그램을 배포하기 전에 맵파일을 만들어 둬야 나중에 에러주소로 에러위치를 찾을수 있습니다.

맵파일을 프로젝트 옵션 -> 링커탭에서 설정합니다.
가능하면 Details로 해시길..

BCB6맵파이 설정


Delphi7맵파일설정화면

 

RAD2007맵파일 설정화면


위와같이 맵파일을 설정한후에 컴파일하시면 exe와 같은 이름의 xxx.map파일이 생성됩니다.


AccessViolation주소와 Map파일을 이용해 예외발생 위치 찾기

이제 Address를 이용해 예외발생 위치를 찾아보겠습니다.
위 메세지의 경우 예외발생 위치가 Project1.exe 모듈의  0x00402272 위치의 코드에서 발생했습니다.

모듈이 xxx.exe인경우에는

1) 먼저 address에서 HInstance인 0x400000을 뺍니다.
2) 그리고 다시 PE-Header크기지 0x1000을 뺍니다.

위그림의 AccessViolation - Address인 0x00402272에서 0x400000을 빼도 다시 0x1000을 빼면 0x1272 번지가 나옵니다.

3) 이제 Map파일에서 0x1272값을 찾으시면 됩니다.

여기서 Delphi의 경우 exe의 모든 라인이 map파일에 기록됩니다.


C++Builder의 경우
 
  ; C++Builder의 경우 함수시작Address만 map파일에 기록되고
     함수내부의 각 line에 대한 주소는 map파일에 기록되지 않습니다. 
  ; 그래서 맵파일에서 예외발생 라인까지는 못찾고 예외가 발생한 함수이름정도 찾을수 있습니다.

  ; 예외가 발생한 함수이름을 map파일에서 찾을때는
    Err-Address보다 작으면서 가장 Adress값이 가까운 함수이름을 찾으면 됩니다.

 

그럼..

시녕tm [palindrome]   2009-04-23 11:20 X
그림이 안보이네요.. 저만 그런가요 ^^?
장성호 [nasilso]   2009-04-23 11:44 X
어 그렇네요.. 수정해야겟네요...

+ -

관련 글 리스트
886 [Exception] 예외처리2 - AccessViolation발생시 에러위치 찾기 장성호 12949 2009/04/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.