Friday, March 2, 2012

Call stack이 안 보일경우에도 crash된 코드 줄 찾는 방법



dump된 파일 정보로 부터 crash된 부분의 콜스텍을 찾을 경우에
pdb파일과 심볼이 안맞아 주소만 보일때가 있다.
이럴경우 어느부분에서 crash가 낳는지 찾는게 쉽지않다.

--------------------------
  00000000()
  aaaa.dll!44024e33()
  [Frames below may be incorrect and/or missing, no symbols loaded for abcdefg.dll]
  aaaa.dll!4402e95b()
  aaaa.dll!44025394()
  aaaa.dll!4401ebd2()
  aaaa.dll!4401ef59()
  aaaa.dll!4402e95b()
  aaaa.dll!44019b8c()
  aaaa.dll!4400df08()
  aaaa.dll!44057adb()
  aaaa.dll!4400ff33()
  bbbb.dll!100449d5()
----------------------------

그러나, map 파일을 이용하면 각 콜스텍이 가리키고 있는 주소형식(44024e33())을 이용하여
어느 함수에서 crash가 발생한지 추적이 가능하다.
(map파일이 없다면, 해당버젼의 소스(aaaa.dll 소스) 코드를 가지고 map파일을 생성하면 된다.)

map 파일이 생성되었다면, aaaa.map파일을 열어 보면, 아래와 같은 형식으로 구성되어 있는것을 볼수있다.

---------------------
 Address         Publics by Value              Rva+Base       Lib:Object

 0000:00000000       __except_list              00000000     <absolute>
 0000:00000093       ___safe_se_handler_count   00000093     <absolute>
 0000:00000000       ___ImageBase               44000000     <linker-defined>
 0001:00000000       ??1Idddddd@@UAE@XZ 44001000 f i afdafa.obj
 0001:00000010       ??_cccccc@@UAEPAXI@Z 44001010 f i afdafa.obj
 0001:00000010       ??_ggggggg@@UAEPAXI@Z 44001010 f i afdafa.obj
0001:00000010       ??_kkkkkkkk@@UAEPAXI@Z 44002010 f i afdafa.obj
..........................................
-----------------------

여기서 Rva+Base 의 주소를 찾고하여,
만약  aaaa.dll!44001f33()이 어떤 함수부분인지 찾고자 한다면,
44001f33과 가장 근접하게 큰 주소를 map파일에서 찾은후,
그 앞에 있는 함수를 참고하면 된다.
위의 map 파일 예제의 경우는 gggggg의 함수에서 crash난것으로 판단이 가능하다.

No comments:

Post a Comment