본문 바로가기

IT

[디버깅팁] map, cod 파일을 이용한 디버깅 팁

반응형



DataAbortTest.zip


Visual Studio 2005 에서 map, cod 파일을 생성하여 디버깅 하는 방법에 대해서 정리해봅니다.


map, cod 파일을 이용하면, Exception 이 발생해서 죽은 메모리 주소에서 어떤 함수 및 라인에서

죽는지 알 수 있습니다. 예를 들면, WinCE 6.0 에서 아래와 같은 메세지에서도 map, cod를 이용해서 

어디에서 죽었는지 알수 있습니다.



Exception 'Data Abort' (4): Thread-Id=07430422(pth=82ea6b40), Proc-Id=00400002(pprc=81d79308) 'NK.EXE', VM-active=0742020e(pprc=8661c480) 'TestApplication.exe'
PC=c0211c08(TestApplication.exe+0x00001c08) RA=c0211d28(mgtt_o.dll+0x00001d28) SP=d620fa70, BVA=00000000



위 메세지를 해석해보면 '죽은 위치는 c0211c08 이며, TestApplication.exe 모듈에서 0x00001c08 만큼 떨어진 위치에서 죽었습니다' 라고 이해하면 됩니다. 



그럼 간단하게 win32 예제를 만들어서 죽는 위치를 찾는 방법을 알려드리겠습니다.



Step1. map, cod 파일 생성하기


map, cod 파일을 생성하기 위해서 프로젝트 설정을 아래와 같이 바꿔주세요. 그리고 빌드하면 map, cod 파일이 생성됩니다.


[cod 생성]


[map 생성]


Step2. 프로젝트 실행


아래와 같이 Exception 창이 발생합니다. 

포인터 변수 p1 값이 NULL 인데 값을 할당하려다가 문제가 발생했습니다.


죽은 위치는 DataAbortTest.exe 의 0x0041669 입니다. 이 값을 토대로 죽은 위치를 찾아보겠습니다.



Step3. map 파일 분석하기


Rva + Base 에서 죽은 위치 0x0041669 의 근사치를 찾습니다.

이때 0x0041669 주소보다 큰 값이 아닌 작은 값을 참고해야 합니다. 

여기서는 아래 그림과 같이 0041600 이 되겠습니다.


map 파일에서 알 수 있는 정보는 아래와 같습니다.


' 죽은 파일의 위치는 DataAbortTest.obj 이고, 함수 funcD~~~ 안에서 죽었다. '

' 그리고 함수 funcD 로부터 오류지점의 offset은 0x0041669 - 0x0041600 = 0x69 이다. '




Step4. cod 파일 분석하기


아래와 같이 funcD@@YAXXZ PROC 를 찾는다. 그리고 그 지점으로 부터 offset [0x69] 만큼 떨어진

부분을 찾아보면 두번째, 빨간색 Box 부분인 것을 알 수 있다.


cod 파일을 이용하여 알수 있는 정보는 아래와 같다.


' DataAbortTest.cpp 파일 77 라인의 *p1 = 3 코드를 수행하면서 죽었다. '




위와 같이 map, cod 파일을 이용하면, 죽는 위치의 주소를 가지고 정확하게 죽는 지점을 찾을 수 있습니다. 참고로 안드로이드에서도 JNI 를 이용하여 라이브러리를 참고하다가 죽은 경우도 안드로이드가 죽은 위치 PC를 알려주므로 위와 같이 map 파일을 생성해서 디버깅 해 볼 수 있습니다.

반응형