'drwtsn32'에 해당되는 글 1건

  1. 2006/08/22 Dr.Watson 4

Dr.Watson
2006/08/22 08:07

Dr.watson을 이용하여 에러가 발생하는 곳을 찾아보자.

먼저 윈도우 98에서는 drwatson.exe를 실행시키면 되고 이렇게 만들어진 추적 파일은 \Windows\Drwatson 폴더에 .wlg 파일로 저장된다.
NT계열에서는 drwtsn32를 실행시키고 C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson 에 .log 파일로 저장된다.

Dr. Watson 설정
시스템은 레지스트리 편집기의 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

Auto 항목이  1 이면 시스템이 자동으로 디버거를 시작하고 메시지 상자를 만들지 않는다.
시스템에 Windows가 설치된 경우 Auto 항목의 값은 기본값 1로 설정되고 Debugger 항목의 값은 Dr. Watson을 시작하는 명령을 지정한다. 이는 프로그램 오류가 발생했을 때 Windows용 Dr. Watson이 자동으로 오류를 진단하고 해당 진단 정보를 로그에 기록
하지만 NET이 설치되면 값은 아래와 같이 설정된다.

NET경우일때 registry값
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Auto"="0"
"Debugger"="\"C:\\WINDOWS\\system32\\vsjitdebugger.exe\" -p %ld -e %ld"
"UserDebuggerHotKey"=dword:00000000

VC++ 6.0 일때
"Debugger"="C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\msdev.exe" -p %ld -e %ld

Dr.Watson을 설정하고 나서...
예제로 아래와 같이 NULL 포인터에 값을 대입하면 예외가 발생한다.
char* pch1 = NULL;
...
*pch1 = 0;
...
delete pch1;

그럼 윈도우는 아래와 같은 오류보고 창을 띄운다. 오류 보고를 하면 MS로 오류보고 되지만 보내지 않을경우 log와 dump를 남기게 된다. dump 파일에 대한 이야기는 나중에 하고 오늘은 log를 보자.



아래 로그 파일을 보면...
"401867 이라는 주소에 오류->" 라고 표시한곳을 볼수 있다. 이곳이 에러(예외)가 발생한곳인데..
이 주소를 가지고 우리는 우선 2가지를 짐작할수 있다.
첫번째는 0x00400000 으로 시작되는 주소로 보아 EXE 파일(DLL은 0x10000000)이라는 점하고
두번째는 에러가 발생한 지점이 1867 이라는 곳이다.
그럼 소스코드에서 에러가 발생한 지점을 어떻게 알수 있을까?

로그 보기 펼치기..

빌드시 아래의 그림처럼 MAP 파일을 생성하자.
Project Options에 /mapinfo:lines 도 추가해준다.

그러면 우리는 아래와 같은 MAP 파일을 얻을수 있다.

Line numbers for .\Debug\dumptestDlg.obj(D:\project\dumptest\dumptestDlg.cpp) segment .text

  41 0001:000002f0    44 0001:00000322    53 0001:00000380    64 0001:000003b0

중간생략

  162 0001:000007e6   164 0001:000007ee   169 0001:00000810   170 0001:0000082d
  171 0001:00000833   175 0001:00000840   177 0001:0000085d   179 0001:00000864
  181 0001:0000086a
  183 0001:0000087c

401867 - 400000 - 1000 = 867 이라는 주소는 179 와 181 사이에 있다.
즉 코드의 179와 181 사이에서 에러가 발생했다는것을 알수가 있다.

실제로 해본결과 Project Options에 Optimizations(Maxmize speed /O2 Minimize Size / O1)  옵션을 추가했을경우 제대로된 log 파일을 얻을수 없었다.

Release 빌드시 위의 옵션 이외의 Default(/D) 옵션으로 해도 지장이 있을지 없을지는 아직 모르겠다. (Reversing이나 해킹방지차원에서)

참고서적 Debugging Applications for .NET and Windows - John robbins
그외에 유경상님 블러그, 정성태님홈피

2006/08/22 08:07 2006/08/22 08:07
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • TWEETY 2006/08/22 09:57  댓글주소  수정/삭제  댓글쓰기
    저 책에 이런 내용이 있어요? ㅋㅋㅋ
    난 왜 못봤지? 너무 뜨문뜨문 봔나?

    난 지금 컴터가 맛가서 testPC에다가 연결해서 놀구 있어요.ㅜㅜ
    미치겐네.. 할 일이 산더민데... as기사는 언제올까..
  • 정성태 2006/08/22 10:20  댓글주소  수정/삭제  댓글쓰기
    "로그 보기" 의 링크가 ^^ 잘못된 것 같습니다.

    참고로, VS.NET 2005 (VC++ 8.0) 에서는 LINE INFO 를 생성하는 것이 아예 없어졌답니다. ^^
    • hongyver 2006/08/22 10:26  댓글주소  수정/삭제
      내용이 길어 more.../less... 버튼처리했습니다.
      누르면 아래로 쫘악...

      line info 생성이 없어졌다는건 옵션만 없어지고 디폴트로 생성된다는뜻인가요? 아님...
      아예 그런 기능이 없어졌다는 뜻인가요?