본문 바로가기

프로그래밍/기타정보

스택덤프/미니덤프로 뻑난곳 알아내는 법 (버그트랩관련)(스크랩)

릴리즈한 exe와 동일한 exe, pdb, map 은 어느 방법을 쓰던지 필수적으로 가지고 있어야 한다!

1. 가장 간단하고 좋은 방법 - .dmp 파일이 있는경우
    .dmp 파일을 VS2005 이상 컴파일러로 실행하여 F5를 눌러보는 것이당.
    바로바로 어디서 뻑났는지 볼 수 있다.
    (뻑난 버젼의 exe, pdb, map 를 같은 폴더에 넣어줘야되고, 빌드되었을때의 소스가 있는 위치를 지정해주면 OK)

2. .dmp 파일이 없고 뻑난 메모리주소만 알고 있는 경우
    이 메모리 주소가 소스에서 어디인지 어떻게 찾는가는 아래처럼 하면 된다.

    .map 파일을 텍스트 에디터로 열어보면 

 Address         Publics by Value              Rva+Base     Lib:Object

 0001:00000038       ??0CSPC@@QAE@XZ            00401038 f   GESPC.obj
 0001:00000065       ?GetBarrackState@CSPC@@UBEHXZ 00401065 f i GESPC.obj
 0001:0000007c       ?GetNextBarrackState@CSPC@@UBEHXZ 0040107c f i GESPC.obj
 0001:00000083       ?GetPrevBarrackState@CSPC@@UBEHXZ 00401083 f i GESPC.obj

    이런식으로.. 라이브러리의 함수들과 매칭되는 주소들이 쫘르륵 나와있다.
    주의할것은,
    버그트랩의 경우 뻑났다고 날아온 주소는 map 파일에서 가장 왼쪽의 Address라고 되어있는 항목이 아니라
    Rva+Base 항목을 의미하는 것이란 사실.

    예를들어,
    버그트랩에서 뻑났다고 날아온 주소가 005B6EC4 인 경우!

 0001:001b5dad       ?OnEventSwordTrail@CActor@... 005b6dad f   geScene:Actor.obj
 0001:001b5f38       ?BeginTrail@CActor@geScene@... 005b6f38 f   geScene:Actor.obj

    뻑났다고 나온 부분이 CActor::OnEventSwordTrail 함수 이후의 부분이고
    CActor::BeginTrail() 함수가 나오기 이전의 부분이므로,
    CActor::OnEventSwordTrail() 함수 내부에서 문제가 일어났다는 것을 알아낼 수 있다.
    만약 .dmp 파일을 열어본 것 처럼 정확하게 소스 몇번째 라인에서 뻑이 났다는것까지 알아보려면
    동일한 버젼의 source를 비주얼 스튜디오에서 F10로 실행시킨 후
    (이때 주의할점 - F10를 눌렀을때
    다시 빌드하시겠습니까 어쩌고가 나오는데 빌드해버리면 안된다..
    만들어졌을때의 exe/pdb/map 을 통해 봐야 하는데, 빌드를 해버리면
    전혀 새로운 exe/pdb/map 이 나오면서 메모리 주소가 달라져 버린다)

    두가지 방법이 있는데, 
    1. Ctrl+F11을 눌러서 어셈모드로 전환 후,
       Ctrl+G를 눌러서 GoTo 창을 뜨게 한 후, 뻑난다는 메모리 주소로 이동하면 끝.
       (어셈모드로 전환하면 디폴트가 Line 이 아닌 Address 로 선택되어 있음)
    2. Alt+F9 를 눌러서 브레이크포인트 설정란을 뜨게 하여 메모리 주소를 추가한 후(메모리 주소로 브레이크포인트 추가)
       F5를 눌러서 실행시킨다. 다만 이 방법은 코드가 실행되어야 하므로, 해당 부분이 실행될 때에 이르러서야
       어느 부분인지 파악이 가능하겠고, 브레이크 포인트는 반드시 F10 으로 실행시킨 후 매번 설정해줘야 한다는 거.
       F10으로 실행하기 전에 설정하면 먹히지 않고, 재실행시에도 리셋된다


pdb/map 파일이 exe파일과 같이 릴리즈되지 않았다면 스택덤프를 남길 시,
함수 이름까지 친절하게 남겨지지 않는데, 이런식으로 뻑난 부분을 찾아가면 된다.
참고로 프로그램 자체에 버그트랩 등 미니덤프파일 남기는 라이브러리 or 로직을 넣지 않았지만
.dmp 파일을 생성하게 하려면 이렇게 dr.watson 을 이용하는 방법이 있다

유지보수하면서 느는건 디버깅 뿐인가 ㅡ.ㅡ

출처 : http://cretom.egloos.com/m/2439116 

'프로그래밍 > 기타정보' 카테고리의 다른 글

정적 분석 도구 - Cppcheck  (0) 2011.07.04
버그트랩 스크랩(http://loveru0.egloos.com/1351931)  (0) 2011.05.20
쉐이더 참고자료  (0) 2010.09.28
쉐이더 EffectTechnique  (0) 2010.09.27
분석 익스포터  (0) 2010.09.17