WinDbg 디버깅2008. 4. 14. 22:56
반응형
VISTA 에서 디버그 메시지가 기본적으로 꺼져 있다는 것 알고 계시지요?
Windows Server 2008 도 마찬가지구요.

까먹구 있었는데 디버깅하다가 보니 DbgPrint/KdPrint 로 출력한 디버그 메시지가 안나오더라구요.
어떻게 켜는지 확인해 보니 WinDbg 명령창에서 아래와 같이 Kd_DEFAULT_MASK 를 수정하면 되더군요.
다음 번에 또 찾기 귀찮아서 여기에 적어 둡니다.

* DPFLTR_INFO_LEVEL 로 켜고 싶을 때
kd > ed Kd_DEFAULT_MASK 8

* DPFLTR_ERROR_LEVEL 로 켜고 싶을 때
kd > ed Kd_DEFAULT_MASK 0xF

* 디버그 메시지를 끄고 싶을 때
kd > ed Kd_DEFAULT_MASK 0

8 로 해도 제가 DbgPrint 한 메시지들은 모두 나오더군요.
참고하시기 바랍니다.

자세한 내용은 아래 링크에 있습니다.
http://www.osronline.com/article.cfm?article=295


http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=&s_key=&no=101
반응형
Posted by GreeMate
WinDbg 디버깅2008. 1. 22. 23:19
반응형

오늘은 제가 어떤 익스텐션 DLL 을 만들었는지 소개합니다.
목적은 "커널덤프 파일에서 파일 옵젝트를 가지고 커널덤프에 존재하는 파일데이터를 모아서 실제 파일로 만드는 것" 입니다.

먼저 익스텐션 DLL 작성에는 두가지가 있다는 점을 알아두셔야 합니다.

1. DbgEng extension DLL
2. WdbgExts estension DLL

1번은 dbgeng.h 에 있는 Debugger Engine API 를 사용하여 익스텐션 DLL 을 만드는 것을 말합니다. Debugger Engine API 는 디버거를 만들 수 있을 정도의 기능을 가졌다고 합니다. 막강하다는 느낌과 함께 복잡할 것 같다는 생각이 드네요. ^^

2번은 wdbgexts.h 에 있는 WdbgExts API 를 사용하여 익스텐션 DLL 을 만드는 것을 말합니다. Old style extension DLL 이라고도 하네요. Old style 이라 그런지 처음 배우기는 이게 훨씬 쉬운 것 같아 이걸 선택했습니다. ^^

지난번에 소개했던 sdk\samples\simplext 가 바로 Old style extension DLL 예제입니다.
소스는 다음 두개입니다.

exts.c - WdbgExts extension DLL 기본골격
simple.c - 예제 command 들

exts.c 는 전혀 수정하지 않고 simple.c 만 myext.c 로 이름을 바꾸고 여기에 제가 원하는 명령 ef (extract file) 를 작성했습니다. 물론 SOURCE 파일도 수정해서 myext.dll 이 만들어지도록 했습니다.
그리고 ntddk.h 를 포함할 수가 없어서 nttype.h 를 별도로 만들어서 NT 커널 구조체를 사용합니다.

myext.dll 이 빌드되면 역시 WinDbg 설치폴더 밑의 winext 폴더로 복사하고 명령할 땐 다음과 같이 합니다. 먼저 help 를 보지요.

kd> !myext.help
Help for extension dll myext.dll
   help - Shows this help
   ef <fileobject address> <filename> - It extracts file from shared section

ef 명령은 FileObject 주소를 하나 골라서 넣어야 합니다. 만들어질 파일 이름하구요.

kd> !myext.ef 85f636e0 C:\temp\test.file
Creating "C:\temp\test.file" with file object(85f636e0)
SHARED_CACHE_MAP
================
FileSize        : 12671
FileSize(Hex)   : 0x317f
InitialVacbs[0] : 0x86792fa0
InitialVacbs[1] : 0x0
InitialVacbs[2] : 0x0
InitialVacbs[3] : 0x0
Vacbs           : 0x85f04638
FileObject      : 0x85f636e0
.Done!

출력에서 짐작하시겠지만 FileObject 로부터 SectionObjectPointer, SharedCacheMap, Vacb를 따라가서 시스템 캐쉬의 메모리를 가져오고 이것들을 모아서 파일로 만드는 것입니다. 현재는 DataSectionObject 나 ImageSectionObject 는 따라가지 않습니다. SharedCacheMap 만을 따라가서 파일을 만듭니다.

따라서 SectionObjectPointer 나 SharedCacheMap 이 NULL 이면 시스템캐쉬에 파일이 올라와 있지 않다는 뜻이고 이런 FileObject 에 대해서는 파일을 만들어내지 못합니다. 생각보다 이런 경우가 많습니다. 이 익스텐션 명령이 모든 FileObject 를 파일로 만들어 줄거라는 환상은 갖지 마시라는 뜻입니다. ^^

SharedCacheMap 이 존재하더라도 파일이 한번이라도 읽힌 적이 있어서 캐쉬에 있을 경우에만 유효한 데이터를 가져옵니다. 파일의 특정영역이 읽힌적이 없어서 캐쉬에 없다면 파일을 만들 때 이 영역은 0으로 채워서 만듭니다. 즉, 불완전한 파일이 만들어지게 됩니다. 이점도 반드시 기억해 주시구요.

이 과정은 "Windows 구조와 원리 그리고 Codes", "Windows Internals" 를 참고해서 만들었습니다. 여러분도 책을 참고해서 구현하실 수 있을 겁니다.

이제부터 구현한 내용을 약간 기술적으로 설명해 봅니다.
머리 아프신분들은 안보셔도 됩니다. ^^

!fileobj 명령을 사용하면 !ef 명령 안에서 하는 모든 동작을 하고 정보를 보여줍니다.
다만 파일로 만들어 주지만 않을 뿐이죠.

kd> !fileobj 85f636e0

\TestProj\DbgExt\myext\sample.txt

Device Object: 0x867b4900   \Driver\Ftdisk
Vpb: 0x8676e530
Access: Read SharedRead

Flags:  0x44042
 Synchronous IO
 Cache Supported
 Cleanup Complete
 Handle Created

File Object is currently busy and has 0 waiters.

FsContext: 0xe170dd90 FsContext2: 0xe170dee8
CurrentByteOffset: 317f
Cache Data:
  Section Object Pointers: 866131dc
  Shared Cache Map: 85f04608         File Offset: 317f in VACB number 0
  Vacb: 86792fa0
  Your data is at: cf08317f

데이터가 존재하는 메모리 주소까지 보여줍니다. !ef 명령에서는 저 메모리 주소를 따라가서 파일로 저장해 주는 과정을 수행합니다.

FileObject 부터 따라가는 과정을 보면

kd> dt _FILE_OBJECT 85f636e0
ntdll!_FILE_OBJECT
   +0x000 Type             : 5
   +0x002 Size             : 112
   +0x004 DeviceObject     : 0x867b4900 _DEVICE_OBJECT
   +0x008 Vpb              : 0x8676e530 _VPB
   +0x00c FsContext        : 0xe170dd90
   +0x010 FsContext2       : 0xe170dee8
   +0x014 SectionObjectPointer : 0x866131dc _SECTION_OBJECT_POINTERS
     ...

kd> dt 0x866131dc _SECTION_OBJECT_POINTERS
ntdll!_SECTION_OBJECT_POINTERS
   +0x000 DataSectionObject : 0x86613260
   +0x004 SharedCacheMap   : 0x85f04608
   +0x008 ImageSectionObject : (null)

kd> dt _SHARED_CACHE_MAP 0x85f04608
nt!_SHARED_CACHE_MAP
   +0x000 NodeTypeCode     : 767
   +0x002 NodeByteSize     : 304
   +0x004 OpenCount        : 0
   +0x008 FileSize         : _LARGE_INTEGER 0x317f
   +0x010 BcbList          : _LIST_ENTRY [ 0x85f04618 - 0x85f04618 ]
   +0x018 SectionSize      : _LARGE_INTEGER 0x40000
   +0x020 ValidDataLength  : _LARGE_INTEGER 0x317f
   +0x028 ValidDataGoal    : _LARGE_INTEGER 0x317f
   +0x030 InitialVacbs     : [4] 0x86792fa0 _VACB
   +0x040 Vacbs            : 0x85f04638  -> 0x86792fa0 _VACB
   +0x044 FileObject       : 0x85f636e0 _FILE_OBJECT
     ...

kd> dt _VACB 0x86792fa0
nt!_VACB
   +0x000 BaseAddress      : 0xcf080000
   +0x004 SharedCacheMap   : 0x85f04608 _SHARED_CACHE_MAP
   +0x008 Overlay          : __unnamed
   +0x010 LruList          : _LIST_ENTRY [ 0x805587e0 - 0x86793538 ]

kd> db 0xcf080000
cf080000  3b 3b 3b 20 54 72 69 6e-69 74 79 20 54 6f 74 61  ;;; Trinity Tota
cf080010  6c 20 53 65 63 75 72 69-74 79 0d 0a 3b 3b 3b 20  l Security..;;;
cf080020  54 68 69 73 20 66 69 6c-65 20 63 6f 6e 74 61 69  This file contai
cf080030  6e 73 20 61 6c 6c 20 63-6f 6d 6d 6f 6e 20 73 74  ns all common st
cf080040  72 69 6e 67 73 20 64 65-66 69 6e 65 64 20 69 6e  rings defined in
cf080050  20 55 73 65 72 20 49 6e-74 65 72 66 61 63 65 20   User Interface
cf080060  50 72 6f 74 6f 74 79 70-65 20 0d 0a 0d 0a 3b 3b  Prototype ....;;
cf080070  3b 20 49 44 20 4e 61 6d-69 6e 67 20 43 6f 6e 76  ; ID Naming Conv

이렇게 따라와서 메모리의 내용을 파일로 쓰는 겁니다.

파일이 1MB 이하일 땐 InitialVacbs 가 사용되고 1MB 초과일 땐 Vacbs 가 사용된다는 둥 VACB 는 256KB 블럭을 가리킨다는 둥 고려할 내용이 몇가지 있지만 책을 통해서 공부해 보시는게 좋을 것 같습니다.

익스텐션 DLL 소스와 바이너리를 첨부합니다.
맘대로 수정해서 사용하셔도 되구요 버그 발견해서 보고해 주시거나 수정해 주시는 것은 더욱 환영입니다. ^^


http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=&s_key=&no=98
반응형
Posted by GreeMate
WinDbg 디버깅2008. 1. 11. 00:55
반응형

오래간만에 글 올립니다. 그동안 좀... 아니 많이 바빴네요. ^^

그동안 미뤄왔던 익스텐션 DLL 을 만들어 봤습니다. 저도 처음이라 어떻게 만들어야 하는지 찾아보느라고 좀 헤멨었는데요. 웹에도 약간의 정보가 있고 책의 예제로도 정보가 좀 있어서 이것저것 살펴보았는데 빌드가 잘 되지 않아서 살짝 고생했습니다. 그러던중... WinDbg Help 에서 유용한 정보를 얻었습니다. WinDbg 설치하면 익스텐션 DLL 예제도 있고 손쉽게 만들수 있다는 사실입니다. 역시 이것저것 잡다한 것 볼 필요없고 교과서만 보면 된다는... ^^

WinDbg 설치 폴더에 보면 sdk 라는 폴더가 있습니다. 이것을 이용하면 됩니다. 설치중에 다음과 같이 선택할 수 있습니다. 혹시 sdk 폴더가 없다면 재설치를 하면서 확실히 선택해 줍니다.

사용자 삽입 이미지

이렇게 설치하고 나면 설치폴더 밑에서 sdk 폴더를 찾을 수 있습니다. 샘플들은 sdk\samples 폴더에 몇개 들어 있습니다. 빌드하는 방법은 sdk\samples\readme.txt 에 간략하게 설명되어 있는데 이것을 살짝 요약해 보도록 하겠습니다.

1. WDK(Windows Driver Kit) 를 빌드 용도로 이용한다.
빌드는 WDK 6000으로 합니다. DLL 이라서 Visual C++ 로 빌드한다는 웹문서들이 종종 있는데 그래도 되지만 여기서는 WDK 를 권장하고 있습니다. 뭐... 하라는 대로 하죠. ^^

2. 빌드 명령창을 띄운다.
WDK 가 설치되어 있으면 시작메뉴에서 Build Environment 를 고를 수 있는데 "Windows Server 2003" 또는 "Windows Vista" 를 사용하라고 합니다. 저는 "Windows Server 2003 x86 Free Build Environment" 을 선택하여 명령창을 띄웠습니다.

3. 샘플폴더를 정하고 이동한다.
빌드상에 문제가 있는지 경로에 공백이 포함되지 않도록 하라고 합니다. 그래서 저같은 경우는 sdk 폴더를 통채로 다른 곳으로 복사했습니다.
D:\TestProj\DbgExt\sdk

여기서 간단히 테스트해 볼 샘플은 simplext 이고 그곳으로 이동합니다.
D:\TestProj\DbgExt\sdk\samples\simplext>_

4. INC, LIB 경로를 설정한다.
환경변수에 sdk\inc, sdk\lib 를 설정하라고 하는데 저는 그냥 sdk\samples\simplext\SOURCES 파일에 다음과 같이 추가하여 설정했습니다.

DBGSDK_INC_PATH = D:\TestProj\DbgExt\sdk\inc
DBGSDK_LIB_PATH = D:\TestProj\DbgExt\sdk\lib
DBGLIB_LIB_PATH = D:\TestProj\DbgExt\sdk\lib

5. 빌드한다.
build 유틸리티로 빌드합니다. -cZMg 옵션을 주라고 하네요.
Mg 가 익숙치 않았는데 알고보니 별거 아닙니다. M 은 Multiprocessor build, g 는 color 로 보이기네요. ^^

사용자 삽입 이미지

6. 빌드된 simple.dll 을 WinDbg 설치폴더로 복사한다.
저는 WinDbg 설치 폴더 밑에 있는 winext 폴더로 복사했습니다. 여기에는 이미 ext.dll, kext.dll, logexts.dll 등이 들어 있어서 새로운 익스텐션 DLL 을 넣어줘도 전혀 어색하지 않습니다. ^^

7. WinDbg 에서 사용한다.
다음과 같이 일반적인 익스텐션 DLL 쓰듯이 사용하시면 됩니다.
kd> !simple.help

구지 명시적으로 로드하고 싶으면 다음과 같이 하시고
kd> .load simple.dll
수정을 해서 새로 복사해 넣고 싶으면 올려놓은 걸 내려야 하니까 다음과 같이 합니다.
kd> .unload simple.dll

여기까지 간단한 익스텐션 DLL 작성방법이었습니다. 생각보다 간단하죠?
저도 저 simplext 를 수정해서 저의 익스텐션 DLL 을 만들었습니다. 일단 잘 모르는 상태에서는 그게 가장 간단하더군요. 위의 설명만 가지고도 여러분의 익스텐션 DLL 은 충분히 작성이 가능하실 거라 생각됩니다.

다음 시간에는 제가 만든 익스테션 DLL 을 예제로 설명하여 조금 더 도움을 드릴 수 있도록 해 보겠습니다.

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=&s_key=&no=97

반응형
Posted by GreeMate
WinDbg 디버깅2007. 10. 14. 01:45
반응형

심볼 스토어(Symbol Store)란 쉽게 말하면 MS 웹심볼 서버 같이 심볼파일들을 모든 버전에 대해서 모아 놓는 곳을 의미합니다. 모든 심볼파일들을 모아 놓고 심볼경로로 여기만 지정하면 디버깅하는 모듈의 심볼파일이 저절로 찾아져서 매번 심볼파일을 찾고 복사하는 작업을 할 필요가 없습니다.

제 PC 는 D:\MySymbol 이라는 심볼 스토어를 만들었습니다.
(말이 심볼 스토어지 일반적인 그냥 폴더입니다. ^^)

모듈을 빌드하고 테스트할 때마다 매번 빌드된 심볼파일을 심폴패스에 복사해야 하는데 버전이 다르면 기존 것을 지우고 복사해야 하는 등의 번거로운 점이 있었기 때문에 이것을 해결하고 싶었습니다.

그래서 D:\MySymbol 을 만들어서 빌드한 심볼파일을 그때 그때 심볼 스토어 형식으로 더하면 D:\MySymbol 에는 제가 개발하는 모듈의 모든 버전들에 대한 심볼파일들이 체크썸에 따라 분류되어 쌓입니다. 새로 빌드한 심볼파일의 복사가 실패하지도 않을 것이고 과거 버전들에 대한 디버깅도 가능해 집니다.

심볼파일을 더하기 편하도록 배치파일 AddMySym.bat 을 만들었습니다.
배치파일 내부에서 symstore.exe 를 사용하는데 WinDbg 폴더에 있는 심볼 스토어 유틸리티입니다.
(저는 WinDbg 경로를 패스로 뚫어놔서 배치파일 상에서 그냥 symstore 를 사용하도록 되어있습니다.)

심볼파일 경로를 파라미터로 받으므로 다음과 같이 명령창에서 하셔도 되구요.
C:\Test> AddMySym C:\Project\Bin\MyDrv.pdb

편하게 사용하려면 이 배치파일을 바탕화면에 복사해 놓거나 단축아이콘을 만들어 놓고
심볼파일을 들어다가 Drag & Drop 해 넣으면 됩니다.

WinDbg 사용하실 때는 심볼패스에 D:\MySymbol 을 추가해 놓으시면 됩니다.

D:\MySymbol 의 용량이 커지게 되면 나중에 한꺼번에 지우면 되지요. 어차피 개발중인 것들이었으므로...
물론 배포하는 버전의 심볼은 항상 따로 보관하는 곳이 있어야 겠지요.

AddMySym.bat 을 첨부합니다.
사용하실 분은 로컬경로만 자신에 맞게 수정하시고 사용하시면 됩니다.

Tip) 네트워크 공유 폴더를 심볼 스토어로 사용하시면 자신의 팀 모듈들, 제품 모듈들에 대한 심볼 스토어를 만들수 있습니다. 팀원들이 공유하는 심볼 스토어가 만들어 지는 것이지요.


http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=&s_key=&no=94
반응형
Posted by GreeMate
WinDbg 디버깅2007. 9. 23. 02:29
반응형
WinDbg 사용팁에 대해서 정리해 보려고 합니다.
앞으로 시간될 때마다 하나씩 정리해서 올리려고 하는데요.

대강의 분류는 제목에 다음과 같이 표시할 예정입니다.

[WinDbg 사용] : WinDbg 환경설정이나 사용가이드 등의 내용
[WinDbg 분석] : 덤프파일 분석 예제
[WinDbg 명령] : 유용하게 사용할 수 있는 명령어

시작해 보니 생각보다 시간이 많이 들기는 하는데 한번 하는데까지 해 보겠습니다.
모두가 WinDbg를 쉽게 사용하는 그날까지~~~

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=6&s_bulu=&s_key=&no=23
반응형
Posted by GreeMate
WinDbg 디버깅2007. 9. 23. 02:27
반응형

!process 명령의 기본적인 형식은 다음과 같습니다.

!process Process Flags

자세한 사용법은 WinDbg 도움말을 참고하시는게 항상 좋구요. ^^
여기서는 제가 자주 사용하는 방법에 대해서만 간단히 설명 드리려고 합니다.

1) !process 0 0
모든 프로세스를 보고 싶을 때 사용합니다.

Process에 0 을 주면 모든 프로세스라는 뜻이 됩니다.
Flags에 0 을 주면 가장 간단히 보여달라는 뜻이 됩니다.

예제)

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 867b5a00  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 06c20000  ObjectTable: e1003e60  HandleCount: 281.
    Image: System

PROCESS 860a1220  SessionId: none  Cid: 0578    Peb: 7ffde000  ParentCid: 0004
    DirBase: 0f89e000  ObjectTable: e16d73c8  HandleCount:  21.
    Image: smss.exe

PROCESS 86433b20  SessionId: 0  Cid: 05ec    Peb: 7ffd9000  ParentCid: 0578
    DirBase: 113af000  ObjectTable: e100fa68  HandleCount: 489.
    Image: csrss.exe

PROCESS 863fcda0  SessionId: 0  Cid: 0604    Peb: 7ffd7000  ParentCid: 0578
    DirBase: 14214000  ObjectTable: e15a6698  HandleCount: 471.
    Image: winlogon.exe

...

2) !process 0 0 ImageName.exe
특정 프로세스를 찾을 때 사용합니다.

모든 프로세스 중에서 원하는 프로세스 이름과 일치하는 녀석만 찾아서 보여줍니다.
프로세스 이름은 위에서 보여지는 것처럼 확장자까지 일치해야 합니다.

예제)

kd> !process 0 0 notepad.exe
PROCESS 859a1020  SessionId: 0  Cid: 04d8    Peb: 7ffdf000  ParentCid: 0150
    DirBase: 0d413000  ObjectTable: e197b118  HandleCount:  53.
    Image: notepad.exe


3) !process Process 7
특정 프로세스의 정보를 자세히 보고 싶을 때 사용합니다.

Flags 는 비트마다 의미가 있는데 7 로 주면 1,2,3 비트 모두 켠 것이므로 가장 자세히 보여줍니다.
각각의 의미는 역시 WinDbg 도움말!!!

예제)

위에서 찾아진 notepad.exe의 정보중 PROCESS 859a1020 를 참고해서 다음과 같이 명령합니다.

kd> !process 859a1020  7
PROCESS 859a1020  SessionId: 0  Cid: 04d8    Peb: 7ffdf000  ParentCid: 0150
    DirBase: 0d413000  ObjectTable: e197b118  HandleCount:  53.
    Image: notepad.exe
    VadRoot 864c5cb8 Vads 68 Clone 0 Private 225. Modified 19. Locked 0.
    DeviceMap e287fc90
    Token                             e15c9570
    ElapsedTime                       00:00:19.390
    UserTime                          00:00:00.046
    KernelTime                        00:00:00.250
    QuotaPoolUsage[PagedPool]         34280
    QuotaPoolUsage[NonPagedPool]      2720
    Working Set Sizes (now,min,max)  (1003, 50, 345) (4012KB, 200KB, 1380KB)
    PeakWorkingSetSize                1004
    VirtualSize                       32 Mb
    PeakVirtualSize                   37 Mb
    PageFaultCount                    1088
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      488

        THREAD 859a1da8  Cid 04d8.00a4  Teb: 7ffde000 Win32Thread: e2fe45c8 WAIT: (WrUserRequest) UserMode Non-Alertable
            85dd62c8  SynchronizationEvent
        Not impersonating
        DeviceMap                 e287fc90
        Owning Process            859a1020       Image:         notepad.exe
        Wait Start TickCount      151791         Ticks: 1168 (0:00:00:18.250)
        Context Switch Count      797                 LargeStack
        UserTime                  00:00:00.0031
        KernelTime                00:00:00.0250
        Win32 Start Address windbg!`string' (0x0100739d)
        Start Address kernel32!BaseProcessStartThunk (0x7c810665)
        Stack Init ec962000 Current ec961c20 Base ec962000 Limit ec95d000 Call 0
        Priority 10 BasePriority 8 PriorityDecrement 0 DecrementCount 16
        ChildEBP RetAddr  Args to Child             
        ec961c38 804e3bd2 859a1e18 859a1da8 804e3c1e nt!KiSwapContext+0x2f (FPO: [Uses EBP] [0,0,4])
        ec961c44 804e3c1e 000025ff e2fe45c8 00000000 nt!KiSwapThread+0x6b (FPO: [0,0,0])
        ec961c6c bf802fa0 00000001 0000000d 00000001 nt!KeWaitForSingleObject+0x1c2 (FPO: [Non-Fpo])
        ec961ca8 bf801b80 000025ff 00000000 00000001 win32k!xxxSleepThread+0x192 (FPO: [Non-Fpo])
        ec961cec bf80f24e ec961d18 000025ff 00000000 win32k!xxxRealInternalGetMessage+0x418 (FPO: [Non-Fpo])
        ec961d4c 804df99f 0007fefc 00000000 00000000 win32k!NtUserGetMessage+0x27 (FPO: [Non-Fpo])
        ec961d4c 7c93eb94 0007fefc 00000000 00000000 nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ ec961d64)
        0007fed8 00000000 00000000 00000000 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])


콜스택까지 보이므로 이 프로세스가 행이 걸려있다면 어디에서 멈춰있는지 확인하는 목적으로 종종 사용하기도 합니다.


4) !process 0 7
모든 프로세스의 정보를 자세히 보고 싶을 때 사용합니다.

저같은 경우 모든 프로세스, 쓰레드의 콜스택을 보고 싶을 때 사용합니다.
여러 프로세스, 쓰레드 간의 DeadLock 문제가 발생했다면 모든 콜스택 중에서 제가 작성한 드라이버가 존재하는 콜스택을 검색하고 이것들을 분석하여 원인을 찾기도 합니다.
나중에 DeadLock 분석 예제에서 활용방법을 좀 더 자세히 보게 될 것입니다.

예제)

kd> !process 0 7
**** NT ACTIVE PROCESS DUMP ****
PROCESS 867b5a00  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 06c20000  ObjectTable: e1003e60  HandleCount: 282.
    Image: System
    VadRoot 867ac3c0 Vads 4 Clone 0 Private 3. Modified 8487. Locked 0.
    DeviceMap e1003148
    Token                             e1000b40
    ElapsedTime                       00:33:54.765
    UserTime                          00:00:00.000
    KernelTime                        00:00:36.078
    QuotaPoolUsage[PagedPool]         0
    QuotaPoolUsage[NonPagedPool]      0
    Working Set Sizes (now,min,max)  (70, 0, 345) (280KB, 0KB, 1380KB)
    PeakWorkingSetSize                619
    VirtualSize                       1 Mb
    PeakVirtualSize                   3 Mb
    PageFaultCount                    8781
    MemoryPriority                    BACKGROUND
    BasePriority                      8
    CommitCharge                      7

        THREAD 867b5788  Cid 0004.0008  Teb: 00000000 Win32Thread: 00000000 WAIT: (WrFreePage) KernelMode Non-Alertable
            80568e10  SynchronizationEvent
            80569e00  NotificationTimer
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            867b5a00       Image:         System
        Wait Start TickCount      130223         Ticks: 9 (0:00:00:00.140)
        Context Switch Count      17103            
        UserTime                  00:00:00.0000
        KernelTime                00:00:02.0187
        Start Address nt!Phase1Initialization (0x806b07cb)
        Stack Init f7c46000 Current f7c45798 Base f7c46000 Limit f7c43000 Call 0
        Priority 0 BasePriority 0 PriorityDecrement 0 DecrementCount 0
        ChildEBP RetAddr  Args to Child             
        f7c457b0 804e3bd2 00000000 867b5788 804e3b83 nt!KiSwapContext+0x2f (FPO: [Uses EBP] [0,0,4])
        f7c457bc 804e3b83 80701aa8 003de060 00000000 nt!KiSwapThread+0x6b (FPO: [0,0,0])
        f7c457f4 804eb549 00000002 f7c45828 00000001 nt!KeWaitForMultipleObjects+0x284 (FPO: [Non-Fpo])
        f7c45840 806af2bd 867b5788 00000000 00000044 nt!MmZeroPageThread+0x61 (FPO: [Non-Fpo])
        f7c45dac 80576128 80087000 00000000 00000000 nt!Phase1Initialization+0x1287 (FPO: [Non-Fpo])
        f7c45ddc 804f1c81 806b07cb 80087000 00000000 nt!PspSystemThreadStartup+0x34 (FPO: [Non-Fpo])
        00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

        THREAD 867b4d20  Cid 0004.0010  Teb: 00000000 Win32Thread: 00000000 WAIT: (WrQueue) UserMode Non-Alertable
            8056b4c0  Unknown
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            867b5a00       Image:         System
        Wait Start TickCount      130233         Ticks: 22 (0:00:00:00.343)
        Context Switch Count      6541            
        UserTime                  00:00:00.0000
        KernelTime                00:00:00.0109
        Start Address nt!ExpWorkerThread (0x804e42f1)
        Stack Init f7c62000 Current f7c61d24 Base f7c62000 Limit f7c5f000 Call 0
        Priority 13 BasePriority 13 PriorityDecrement 0 DecrementCount 16
        ChildEBP RetAddr  Args to Child             
        f7c61d3c 804e3bd2 867b4d90 867b4d20 804e42d6 nt!KiSwapContext+0x2f (FPO: [Uses EBP] [0,0,4])
        f7c61d48 804e42d6 867b4098 8056b4c0 867b4d20 nt!KiSwapThread+0x6b (FPO: [0,0,0])
        f7c61d74 804e438e 00000001 00000001 00000000 nt!KeRemoveQueue+0x22a (FPO: [Non-Fpo])
        f7c61dac 80576128 867b4098 00000000 00000000 nt!ExpWorkerThread+0xcc (FPO: [Non-Fpo])
        f7c61ddc 804f1c81 804e42f1 00000000 00000000 nt!PspSystemThreadStartup+0x34 (FPO: [Non-Fpo])
        00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

        ...

PROCESS 860a1220  SessionId: none  Cid: 0578    Peb: 7ffde000  ParentCid: 0004
    DirBase: 0f89e000  ObjectTable: e16d73c8  HandleCount:  21.
    Image: smss.exe
    VadRoot 86443d30 Vads 16 Clone 0 Private 28. Modified 10. Locked 0.
    DeviceMap e1003148
    Token                             e181cde0
    ElapsedTime                       00:34:19.515
    UserTime                          00:00:00.015
    KernelTime                        00:00:00.015
    QuotaPoolUsage[PagedPool]         5228
    QuotaPoolUsage[NonPagedPool]      640
    Working Set Sizes (now,min,max)  (99, 50, 345) (396KB, 200KB, 1380KB)
    PeakWorkingSetSize                121
    VirtualSize                       3 Mb
    PeakVirtualSize                   11 Mb
    PageFaultCount                    217
    MemoryPriority                    BACKGROUND
    BasePriority                      11
    CommitCharge                      41

        THREAD 860a0da8  Cid 0578.057c  Teb: 7ffdd000 Win32Thread: 00000000 WAIT: (UserRequest) UserMode Non-Alertable
            86433b20  ProcessObject
            863fcda0  ProcessObject
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            860a1220       Image:         smss.exe
        Wait Start TickCount      25411          Ticks: 107191 (0:00:27:54.859)
        Context Switch Count      43            
        UserTime                  00:00:00.0000
        KernelTime                00:00:00.0015
        Start Address 0x4858a4c8
        Stack Init f71d2000 Current f71d1960 Base f71d2000 Limit f71cf000 Call 0
        Priority 11 BasePriority 11 PriorityDecrement 0 DecrementCount 0
        Kernel stack not resident.

        THREAD 863b4ac0  Cid 0578.05c4  Teb: 7ffdc000 Win32Thread: 00000000 WAIT: (WrLpcReceive) UserMode Non-Alertable
            866b90a8  Semaphore Limit 0x7fffffff
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            860a1220       Image:         smss.exe
        Wait Start TickCount      25411          Ticks: 107201 (0:00:27:55.015)
        Context Switch Count      9            
        UserTime                  00:00:00.0000
        KernelTime                00:00:00.0000
        Start Address 0x485893b2
        Stack Init f71ce000 Current f71cdc34 Base f71ce000 Limit f71cb000 Call 0
        Priority 11 BasePriority 11 PriorityDecrement 0 DecrementCount 0
        Kernel stack not resident.

        ...

PROCESS 86433b20  SessionId: 0  Cid: 05ec    Peb: 7ffd9000  ParentCid: 0578
    DirBase: 113af000  ObjectTable: e100fa68  HandleCount: 476.
    Image: csrss.exe
    VadRoot 858c76b8 Vads 129 Clone 0 Private 342. Modified 1742. Locked 0.
    DeviceMap e1003148
    Token                             e1825720
    ElapsedTime                       00:34:17.718
    UserTime                          00:00:01.765
    KernelTime                        00:00:04.046
    QuotaPoolUsage[PagedPool]         112960
    QuotaPoolUsage[NonPagedPool]      6072
    Working Set Sizes (now,min,max)  (1693, 50, 345) (6772KB, 200KB, 1380KB)
    PeakWorkingSetSize                1696
    VirtualSize                       79 Mb
    PeakVirtualSize                   79 Mb
    PageFaultCount                    4537
    MemoryPriority                    BACKGROUND
    BasePriority                      13
    CommitCharge                      421

        THREAD 86431da8  Cid 05ec.05fc  Teb: 7ffdc000 Win32Thread: e18f2eb0 WAIT: (WrLpcReceive) UserMode Non-Alertable
            865a9090  Semaphore Limit 0x7fffffff
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            86433b20       Image:         csrss.exe
        Wait Start TickCount      132197         Ticks: 459 (0:00:00:07.171)
        Context Switch Count      1804                 LargeStack
        UserTime                  00:00:00.0609
        KernelTime                00:00:00.0109
        Win32 Start Address 0x0001fc07
        LPC Server thread working on message Id 1fc07
        Start Address 0x75a84616
        Stack Init f7166000 Current f7165c34 Base f7166000 Limit f7163000 Call 0
        Priority 14 BasePriority 13 PriorityDecrement 0 DecrementCount 16
        ChildEBP RetAddr  Args to Child             
        f7165c4c 804e3bd2 86431e18 86431da8 804e3c1e nt!KiSwapContext+0x2f (FPO: [Uses EBP] [0,0,4])
        f7165c58 804e3c1e e1648b60 80563ec0 e1648b60 nt!KiSwapThread+0x6b (FPO: [0,0,0])
        f7165c80 8057643b 00000001 00000010 8057ad01 nt!KeWaitForSingleObject+0x1c2 (FPO: [Non-Fpo])
        f7165d30 80576641 00000094 005affd0 00000000 nt!NtReplyWaitReceivePortEx+0x3dc (FPO: [Non-Fpo])
        f7165d4c 804df99f 00000094 005affd0 00000000 nt!NtReplyWaitReceivePort+0x18 (FPO: [Non-Fpo])
        f7165d4c 7c93eb94 00000094 005affd0 00000000 nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ f7165d64)
        005afff4 00000000 00000000 00000000 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])

        THREAD 864d6d18  Cid 05ec.060c  Teb: 7ffda000 Win32Thread: e1563008 WAIT: (WrLpcReceive) UserMode Non-Alertable
            865a9090  Semaphore Limit 0x7fffffff
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            86433b20       Image:         csrss.exe
        Wait Start TickCount      132529         Ticks: 147 (0:00:00:02.296)
        Context Switch Count      1862                 LargeStack
        UserTime                  00:00:00.0781
        KernelTime                00:00:00.0281
        Start Address 0x75a84616
        Stack Init f7126000 Current f7125c34 Base f7126000 Limit f7123000 Call 0
        Priority 13 BasePriority 13 PriorityDecrement 0 DecrementCount 16
        ChildEBP RetAddr  Args to Child             
        f7125c4c 804e3bd2 864d6d88 864d6d18 804e3c1e nt!KiSwapContext+0x2f (FPO: [Uses EBP] [0,0,4])
        f7125c58 804e3c1e 00000000 80563ec0 e1648b60 nt!KiSwapThread+0x6b (FPO: [0,0,0])
        f7125c80 8057643b 00000001 00000010 8057ad01 nt!KeWaitForSingleObject+0x1c2 (FPO: [Non-Fpo])
        f7125d30 80576641 00000094 0071ffd0 0071feec nt!NtReplyWaitReceivePortEx+0x3dc (FPO: [Non-Fpo])
        f7125d4c 804df99f 00000094 0071ffd0 0071feec nt!NtReplyWaitReceivePort+0x18 (FPO: [Non-Fpo])
        f7125d4c 7c93eb94 00000094 0071ffd0 0071feec nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ f7125d64)
        0071fff4 00000000 00000000 00000000 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])

        ...

PROCESS 863fcda0  SessionId: 0  Cid: 0604    Peb: 7ffd7000  ParentCid: 0578
    DirBase: 14214000  ObjectTable: e15a6698  HandleCount: 471.
    Image: winlogon.exe
    VadRoot 86095198 Vads 188 Clone 0 Private 1156. Modified 2210. Locked 0.
    DeviceMap e1003148
    Token                             e1560af0
    ElapsedTime                       00:34:17.843
    UserTime                          00:00:00.343
    KernelTime                        00:00:01.296
    QuotaPoolUsage[PagedPool]         62420
    QuotaPoolUsage[NonPagedPool]      33176
    Working Set Sizes (now,min,max)  (920, 50, 345) (3680KB, 200KB, 1380KB)
    PeakWorkingSetSize                4351
    VirtualSize                       57 Mb
    PeakVirtualSize                   59 Mb
    PageFaultCount                    7284
    MemoryPriority                    BACKGROUND
    BasePriority                      13
    CommitCharge                      1805

        THREAD 860f1da8  Cid 0604.061c  Teb: 7ffdd000 Win32Thread: 00000000 WAIT: (WrLpcReceive) UserMode Non-Alertable
            866b24b0  Semaphore Limit 0x7fffffff
            860f1e98  NotificationTimer
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            863fcda0       Image:         winlogon.exe
        Wait Start TickCount      130833         Ticks: 1919 (0:00:00:29.984)
        Context Switch Count      112            
        UserTime                  00:00:00.0000
        KernelTime                00:00:00.0000
        Start Address kernel32!BaseThreadStartThunk (0x7c810659)
        Stack Init ef0b6000 Current ef0b5c4c Base ef0b6000 Limit ef0b3000 Call 0
        Priority 13 BasePriority 13 PriorityDecrement 0 DecrementCount 0
        Kernel stack not resident.
        ChildEBP RetAddr  Args to Child             
        ef0b5c64 804e3bd2 860f1e18 860f1da8 804e3c1e nt!KiSwapContext+0x2f (FPO: [Uses EBP] [0,0,4])
        ef0b5c70 804e3c1e e13d23a8 80563ec0 e13d23a8 nt!KiSwapThread+0x6b (FPO: [0,0,0])
        ef0b5c98 8057643b 00000001 00000010 863fcd01 nt!KeWaitForSingleObject+0x1c2 (FPO: [Non-Fpo])
        ef0b5d48 804df99f 00000154 00c5ff70 00000000 nt!NtReplyWaitReceivePortEx+0x3dc (FPO: [Non-Fpo])
        ef0b5d48 7c93eb94 00000154 00c5ff70 00000000 nt!KiFastCallEntry+0xfc (FPO: [0,0] TrapFrame @ ef0b5d64)
        00c5ff80 00000000 00000000 00000000 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])

        THREAD 860f7da8  Cid 0604.0620  Teb: 7ffdc000 Win32Thread: 00000000 WAIT: (WrLpcReceive) UserMode Non-Alertable
            866b2090  Semaphore Limit 0x7fffffff
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            863fcda0       Image:         winlogon.exe
        Wait Start TickCount      70172          Ticks: 62593 (0:00:16:18.015)
        Context Switch Count      36            
        UserTime                  00:00:00.0000
        KernelTime                00:00:00.0000
        Win32 Start Address RPCRT4!ThreadStartRoutine (0x77d86bf0)
        Start Address kernel32!BaseThreadStartThunk (0x7c810659)
        Stack Init f7cca000 Current f7cc9c4c Base f7cca000 Limit f7cc7000 Call 0
        Priority 13 BasePriority 13 PriorityDecrement 0 DecrementCount 0
        Kernel stack not resident.

        THREAD 860f8da8  Cid 0604.0624  Teb: 7ffdb000 Win32Thread: 00000000 WAIT: (DelayExecution) UserMode Alertable
            860f8e98  NotificationTimer
        Not impersonating
        DeviceMap                 e1003148
        Owning Process            863fcda0       Image:         winlogon.exe
        Wait Start TickCount      25469          Ticks: 107306 (0:00:27:56.656)
        Context Switch Count      8            
        UserTime                  00:00:00.0000
        KernelTime                00:00:00.0000
        Win32 Start Address ntdll!RtlpTimerThread (0x7c95798d)
        Start Address kernel32!BaseThreadStartThunk (0x7c810659)
        Stack Init f7cd2000 Current f7cd1cbc Base f7cd2000 Limit f7ccf000 Call 0
        Priority 13 BasePriority 13 PriorityDecrement 0 DecrementCount 0
        Kernel stack not resident.

        ...

이상으로 !process 의 사용에 대해서 간단히 보여드렸습니다.

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=5&s_bulu=&s_key=&no=35

반응형
Posted by GreeMate
WinDbg 디버깅2007. 9. 23. 02:27
반응형

ds, dS는 문자열을 볼 때 유용한 명령어입니다.

ds 는 ANSI_STRING 구조체에 들어있는 문자열을 보여줍니다.
dS 는 UNICODE_STRING 구조체에 들어있는 문자열을 보여줍니다.

예제1) ds

PANSI_STRING pAStr = f9e9f608;

위와 같은 변수가 있었다면 다음과 같이 볼 수 있습니다.

kd> db f9e9f608
f9e9f608  0c 00 0d 00 6a 1d ae f9-00 10 ae f9 00 10 ae f9  ....j...........

구조체의 형태는 다음과 같으므로

typedef struct _STRING {
  USHORT  Length;
  USHORT  MaximumLength;
  PCHAR  Buffer;
} ANSI_STRING *PANSI_STRING;

네번째 바이트부터 보이는 6a 1d ae f9 가 Buffer 포인터입니다. 여기에 문자열이 들어있습니다.
보통 아래와 같이 Display Memory 명령으로 확인합니다.

kd> db f9ae1d6a
f9ae1d6a  6e 74 6f 73 6b 72 6e 6c-2e 65 78 65 00 00 51 01  ntoskrnl.exe..Q.

복잡하게 이렇게 하지 않고 이를 한방에 해결해 주는 것이 ds 입니다.
그냥 f9e9f608 를 주면 불필요한 것은 보여주지도 않고 문자열만 예쁘게 보여줍니다.

kd> ds f9e9f608
f9ae1d6a  "ntoskrnl.exe"


예제2) dS

PUNICODE_STRING pUStr = f9e97c80;

위와 같은 변수가 있었다면 다음과 같이 볼 수 있습니다.

kd> db f9e97c80
f9e97c80  1c 00 1e 00 80 7a e9 f9-00 00 00 00 00 00 00 00  .....z..........

구조체의 형태는 다음과 같으므로

typedef struct _UNICODE_STRING {
  USHORT  Length;
  USHORT  MaximumLength;
  PWSTR  Buffer;
} UNICODE_STRING *PUNICODE_STRING;

네번째 바이트부터 보이는 80 7a e9 f9 가 Buffer 포인터입니다. 여기에 문자열이 들어있습니다.
보통 아래와 같이 Display Memory 명령으로 확인합니다.

kd> db f9e97a80
f9e97a80  49 00 53 00 41 00 50 00-4e 00 50 00 5c 00 54 00  I.S.A.P.N.P.\.T.
f9e97a90  42 00 41 00 30 00 33 00-62 00 30 00 00 00 2a 00  B.A.0.3.b.0...*.

역시 위와 비슷하게 dS 한방으로 예쁘게 볼 수 있습니다.

kd> dS f9e97c80
f9e97a80  "ISAPNP\TBA03b0"


추가로 Display Memory 명령중 문자열을 보는데 편리한 명령어가 있습니다.

da, du 명령어 입니다.

da 는 PCHAR 포인터가 가리키는 문자열을 보여줍니다.
du 는 PWSTR 포인터가 가리키는 문자열을 보여줍니다.


예제3) da

ds 예제에서

PCHAR  Buffer = f9ae1d6a;

이므로 다음과 같이 볼 수 있습니다.

kd> da f9ae1d6a
f9ae1d6a  "ntoskrnl.exe"


예제4) du

dS 예제에서 

PWSTR  Buffer = f9e97a80;

이므로 다음과 같이 볼 수 있습니다.

kd> du f9e97a80
f9e97a80  "ISAPNP\TBA03b0"


문자열 보기좋게 보시기 바랍니다. ^^
Happy Debugging!!!

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=5&s_bulu=&s_key=&no=37

반응형
Posted by GreeMate
WinDbg 디버깅2007. 9. 23. 02:26
반응형

MS에서 제공하는 웹심볼 서버를 간단히 심볼패스로 지정할 수 있는 명령입니다.

다음과 같은 형태로 사용하구요.

.symfix[+] [DownstreamStore]

이 명령을 모르면 다음과 같이 적어줘야 합니다.

.sympath[+] srv*DownstreamStore*http://msdl.microsoft.com/download/symbols

두개는 같은 의미 입니다.
저렇게 긴 URL 을 외우고 있을 필요가 없겠죠.
그냥 .symfix 를 사용하면 됩니다.

명령어 뒤에 [+] 는 + 를 붙여도 되고 붙이지 않아도 된다는 의미입니다.
.symfix+ 와 같이 +를 붙이면 기존에 존재하는 sympath 뒤에 웹심볼 패스가 추가됩니다.
.symfix 와 같이 +를 붙이지 않으면 기존에 존재하는 sympath 는 무시됩니다.

그 뒤에 보이는 [DownstreamStore] 역시 [] 표시가 있으므로 생략 가능합니다.
이것을 생략하면 WinDbg 설치 폴더 밑에 심볼패스가 지정됩니다.

예제)

.sympath 로 현재 상태를 확인해 봅니다.

kd> .sympath
Symbol search path is:

아무것도 없네요.
대충 하나를 지정해 봅니다.

kd> .sympath c:\Symbol
Symbol search path is: c:\Symbol

여기에 .symfix+ 를 사용해서 웹심볼을 추가합니다.

kd> .symfix+ c:\WebSym

다시 .sympath 로 확인해 봅니다.

kd> .sympath
Symbol search path is: c:\Symbol;SRV*c:\WebSym*http://msdl.microsoft.com/download/symbols

처음에 지정했던 c:\Symbol 뒤에 웹심볼 패스가 추가된 것을 볼 수 있습니다.

.symfix 로 간편하게 웹심볼을 활용하시기 바랍니다. ^^

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=5&s_bulu=&s_key=&no=41

반응형
Posted by GreeMate
WinDbg 디버깅2007. 9. 23. 02:25
반응형
Virtual PC 2004 를 실행하고 이에 연결하여 디버깅하는 방법에 대하여 간단히 정리합니다.

VMWare 에 연결하는 방법에 대해서 이미 여러 곳에서 다룬 내용이긴 합니다. ^^
다음과 같이 하라고 하죠.

windbg.exe -k com:port=\\.\pipe\com1,pipe

커맨드 라인에서 위와 같이 하거나 등록정보에 위와 같이 등록해 놓고 사용하라고 합니다.

하지만 저는 그냥 WinDbg UI 에서 하는게 더 편하더군요. (최신 WinDbg ^^ 제껀 6.6.0007.5)



Pipe 체크를 해서 pipe 로 연결할 것임을 알립니다.
Port 에 pipe 이름을 적어줍니다. 일반 시리얼 디버깅과는 이부분이 달라지죠.
\\.\pipe\com1 이라고 지었습니다.
Reconnect 체크를 해야 Virtual PC 가 아직 실행되지 않아서 pipe 가 생성되지 않았을 경우에도 대기합니다.

'확인' 을 누르면 다음과 같이 대기합니다.



자.... 이제 Virtual PC 2004 를 보실까요.

Settings 에서 COM1 을 다음과 같이 Named pipe 로 설정합니다.
제가 위에서 지어준 이름으로요.



OK 해서 설정하시고 Virtual PC 를 실행시키면 됩니다.

물론 Virtual PC 의 boot.ini 는 다음과 같이 시리얼 디버깅 설정이 되어 있어야죠.
이건 뭐 우리가 늘 하던 일반 시리얼 디버깅 설정과 다른 것이 전혀 없습니다.

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug /debugport=COM1 /baudrate=115200

최신 PC 에서 위와 같은 환경으로 돌려보신 분의 무용담을 빌리자면 마치 SoftICE 사용하는 기분이었답니다.
소스라인 디버깅을 하면서 한줄씩 넘기는데 SoftICE 처럼 거의 실시간으로 넘어갔다는...
전혀 WinDbg 스럽지 않죠. WinDbg 는 WinDbg 고유의 갑갑스러움이 있어야 하는데 말이죠. ^^

저도 느껴보고자 제 PC 에서 해 봤습니다. 1년 정도 전에 구입한 PC 구요. ( CPU: 3.2GHz, RAM: 1GB )
오... 사실이었습니다. 이 정도면 아주 쓸만 한데요.
WinDbg 의 갑갑스러움을 다소 떨쳐버릴 수 있을 것 같습니다.

좋은 PC 구입하셔서 Virtual PC 띄워놓고 시원한 디버깅을 즐겨 보시기 바랍니다. ^^

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=5&s_bulu=&s_key=&no=42
반응형
Posted by GreeMate
WinDbg 디버깅2007. 9. 23. 02:24
반응형

심볼을 로드할 때 사용하는 명령입니다.

보통은 심볼패스를 설정한 후에 .reload 와 같이 사용합니다.

kd> .symfix e:\symbols

kd> .reload
Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
........................
Loading User Symbols

lm 을 사용하여 심볼이 로드된 상태를 봅니다.

kd> lm
start    end        module name
804d9000 806ede00   nt         (pdb symbols)          e:\symbols\ntoskrnl.pdb\8592B6763F344B562\ntoskrnl.pdb
806ee000 80701d80   hal        (deferred)            
f9871000 f988b580   Mup        (deferred)   
f996f000 f998e780   fltMgr     (deferred)
...

nt 는 심볼이 로드된 것이 보이는데 나머지는 deferred 라고 나옵니다.
이것은 WinDbg 의 lazy symbol loading (deferred symbol loading) 이라는 특징 때문에 그렇습니다.

WinDbg 는 심볼을 로드할 때 꼭 필요한 심볼만 올려놓고 나머지는 deferred 로 해놓고 심볼을 올리지 않습니다. deferred 로 된 녀석들은 나중에 해당 모듈이 WinDbg 상에서 실제 사용되는 순간이 발생해야만 로드가 됩니다. 필요한 것만 그때 그때 올려주는 나름대로 효율적인 방법입니다. ^^

WinDbg Help 에 보면 .reload 는 다양한 옵션을 가지고 있는데요.
제가 유용하게 사용하는 것만 몇가지 설명합니다.

.reload /i mydrv.sys (심볼이 맞지않아도 강제로 심볼 로드하기)

예를 들어 어제 빌드한 드라이버가 BSOD 를 발생시켜서 덤프가 만들어 졌는데 심볼은 보관하지 않아서 덤프분석을 할 수 없는 문제를 만났다고 가정합시다. 다행히도 어제 소스 코드를 그대로 보관하고 있었다고 하면 그것을 그대로 빌드하여 pdb 파일을 생성할 수 있습니다. 문제는 이 pdb 파일을 로드하려고 해도 WinDbg가 TimeStamp 등을 체크하여 symbol mismatch 에러를 내면서 심볼로드를 하지 않는다는 겁니다. 이런 경우에 심볼이 맞는지 확인하지 말고 강제로 올려달라는 /i 옵션을 사용하면 심볼이 올라갑니다.

.reload /f (심볼 모두 올리기)

보통 lazy symbol loading 상태로 그냥 사용하시면 되지만 혹시 모든 모듈의 심볼을 모두 올려 놓아야 할 경우가 있다면 /f 옵션을 사용해서 모든 모듈의 심볼을 올릴 수 있습니다.

.reload /u (심볼 모두 내리기)

반대로 모든 심볼을 모두 내려야 할 경우가 있다면 /u 옵션을 사용해서 모든 모듈의 심볼을 내릴 수 있습니다.

.reload /u mydrv.sys (특정모듈 심볼 내리기)

mydrv.pdb 를 로드하여 사용하고 있는데 새로 빌드한 mydrv.pdb 를 심볼패스에 복사하면 mydrv.pdb 가 사용중이라서 복사가 실패합니다. 이런 경우 /u mydrv.sys 옵션을 줘서 특정 모듈의 심볼만 내릴 수 있습니다.

.reload mydrv.sys (특정모듈 심볼 로드하기)

위와 같이 내려진 특정 모듈의 심볼만 다시 올리려면 mydrv.sys 처럼 모듈 이름을 줘서 로드합니다.

급하게 정리하느라 뭐가 좀 빠진 느낌이지만... 도움이 되셨기를 바라겠습니다. ^^

http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=4&s_bulu=&s_key=&no=46

반응형
Posted by GreeMate