프로그래밍/델파이

엑세스 바이얼레이션(Access Violation) 주소로 오류가 발생한 소스상의 위치 찾기

채윤아빠 2010. 5. 25. 13:18
728x90
반응형
서론
델파이로 만든 프로그램을 일반 사용자들에게 배포할 때는 기본적으로 불필요한 디버깅 정보를 모두 제거하고 배포를 하게 됩니다. 따라서 유레카로그(EurekaLog) 등의 오류 추적 모듈이 없기 때문에, 다음과 같은 오류창을 만났을 경우 어디서 오류가 발생하였는지 알 수가 없어서 문제 해결이 어렵습니다.


사용자와 동일한 동작을 통한 재현으로 동일한 오류가 발생한다면 다행히도 쉽게 오류를 추적해서 문제를 해결할 수 있지만, 재현이 불가능하고 해당 사용자에게서만 위와 같은 오류창이 발생하게 되면 정말 난감하게 됩니다.

위와 같은 엑세스 바이얼레이션(Access Violation)창이 나타난 경우, 배포한 프로그램에 map 파일이 있다면 그 주소를 가지고 오류가 발생한 부분을 찾을 수 있습니다. 그 방법에 대해서 자세히 알아보도록 하겠습니다.


준비 사항
맵파일(Map file)은 프로젝트 옵션의 Linker에서 "Map file"을 "Detailed"를 선택하고 빌드하면 실행파일과 동일한 이름으로 생성됩니다. 이 파일이 있어야 엑세스 바이얼레이션(Access Violation)창에 나타난 주소를 가지고 소스상에서 오류가 발생한 위치를 찾을 수 있습니다.


차례대로 Delphi 7, Delphi 2007, Delphi 2010 버전들의 맵파일(Map file) 생성 옵션입니다.


오류 발생 위치 찾기
엑세스 바이얼레이션(Access Violation)창에 나타난 주소를 가지고 소스상에서 오류가 발생한 위치를 찾기 위해서는 계산기(?)가 필요합니다. 계산기에서 오류발생 주소에서 $401000을 뺍니다.($6CB305 - $401000) 그리고 그 값을 가지고 맵파일(Map file)에서 비슷한 주소를 찾습니다.


그러면 위 그림과 같이 EyescrapDMUnit.pas 소스의 2275 줄에서 오류가 발생하였음을 알게 됩니다.


오류가 발생한 위치를 찾았으므로 델파이에서 해당 소스 부분을 살펴보고, 왜 문제가 발생하였는지 확인하여 오류를 해결해 주면 되겠습니다.

참고로 위 엑세스 바이얼레이션(Access Violation)창의 경우, 직접적인 원인은 위 소스에서 RootUserFolder 객체가 제대로 초기화되지 않아서 발생한 오류였고, 해당 객체가 제대로 생성되지 않은 원인은 해당 사용자의 PC에서 Access DB에 신규 정보의 삽입(INSERT)이 이루어지지 않아서 발생한 문제였습니다.


결론
프로젝트 옵션의 Linker에서 "Map file"을 "Detailed"를 선택하고 빌드면 실행파일과 동일한 이름의 맵파일(*.map)이 생성되고, 이렇게 생성된 맵파일을 이용하여, 엑세스 바이얼레이션(Access Violation)창의 주소에서 $401000을 뺀 주소로 map 파일을 검색해 보면, 오류를 일으킨 소스의 위치를 찾을 수 있습니다.

델파이 개발자라면, 일반 사용자에게 프로그램을 배포할 경우 빌드시 프로젝트 옵션의 Linker에서 "Map file"을 "Detailed"를 선택하여 놓고, 배포본과 맵파일을 함께 별도로 관리하여 엑세스 바이얼레이션(Access Violation)창에 대한 신속한 조치를 취할 수 있도록 해야겠습니다.