성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<pre class="code"> 환경: Windows 2003 SP1 R2 VS.NET 2005 Debugging Tools for Windows 6.6.3.5 </pre> <hr /> 처음부터 설명드리는 것이 좋겠지요. ^^<br /> <br /> 우선, WinDBG.exe가 설치되어져야 합니다. 현재 WinDBG는 "Debugging Tools for Windows"를 통해서 구할 수 있는데, 설치 파일은 다음의 경로에서 다운로드 받을 수 있습니다.<br /> <br /> Debugging Tools for Windows - Overview<br /> ; <a target="_blank" href="https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools">https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/debugger-download-tools</a><br /> <br /> 설치해도 30MB 가량의 크기이기 때문에, 잘 사용하지 않더라도 그냥 설치해 둬도 무방할 것입니다.<br /> <br /> 설치가 완료되었으면, 다음 경로의 windbg.exe를 실행시킵니다.<br /> C:\Program Files\Debugging Tools for Windows<br /> <br /> 그럼, 다음 화면과 같이 실행되는데... ^^; 썰렁합니다.<br /> <br /> <img alt="WinDBG 실행화면" src="/SysWebRes/bbs/windbg_first_load_screen.png" /><br /> <br /> 사실, 처음 대할 때는 어디서 부터 건드려야 할지 엄두가 안 납니다. Device Driver 개발하는 사람들이야 회사 분위기 속에서 자연스럽게 배웠을 수 도 있겠지만, Windows SDK 분야만 다뤄본 사람들은 그렇지가 못하죠.<br /> <br /> 일단은, 우리의 목표가 거창하게 Device Driver를 개발할 것은 아니기 때문에 SDK 개발자 나름대로의 이해의 폭을 넓히기 위한 정도로만 사용해 보도록 하겠습니다. 따라서, 원격 컴퓨터 연결은 하지 않고, 로컬에만 연결해서 사용해 볼텐데요.<br /> <br /> "File" / "Kernel Debug" 메뉴를 선택하고 나온 대화창에서 아래와 같이 "Local" 탭을 눌러주고, 그 상태에서 "OK" 버튼을 눌러줍니다.<br /> <br /> <img alt="Local Debug 모드" src="/SysWebRes/bbs/windbg_local_debug_mode.png" /><br /> <br /> 그러면, 다음과 같이 Command 창이 뜨는 것을 확인할 수 있습니다. 만약 아래의 Command 창이 보이지 않는 다면, "View" / "Command" 메뉴를 실행해서 나타나게 할 수 있습니다.<br /> <br /> <img alt="Command 창" src="/SysWebRes/bbs/windbg_first_command_screen.png" /><br /> <br /> Command 창의 내용을 잘 보시면, "Symbol search path is : *** Invalid ***"라는 것이 눈에 들어오는데, 별로 바람직하지 않은 상황이란 것만은 확실한 것 같습니다. ^^; 아울러, 그 아래에 친절하게 _NT_SYMBOL_PATH 등을 설정하라고 나오는데요.<br /> <br /> Debugging에 대해서 좀 아신다면 PDB가 Symbol 파일이라는 것 정도는 이미 알고 계시겠지요. 바로 운영체제에 대한 PDB 파일이 있어야 한다는 것인데, Microsoft는 자사의 모든 제품의 Symbol 파일을 웹으로부터 자동으로 다운로드 받을 수 있도록 하는 기능을 제공해 주고 있는데, 그와 관련하여 _NT_SYMBOL_PATH 환경 변수를 설정할 수 있도록 하고 있습니다.<br /> <br /> 따라서, 다음과 같이 "My Computer" 속성창의 "Advanced" 탭의 "Environment Variables"를 통해서 설정하도록 합니다.<br /> <br /> <img alt="_NT_SYMBOL_PATH 환경 변수 설정" src="/SysWebRes/bbs/my_computer_advanced_settings_env_var.png" /><br /> <br /> 구체적인 내용은 다음과 같이 해줍니다. (각자 자신의 환경에 맞게 설정해 주시면 됩니다.)<br /> <br /> <pre class="code"> _NT_SYMBOL_PATH SRV*\\localhost\e$\cachedSymbols*http://msdl.microsoft.com/download/symbols;C:\Windows\system32;. </pre> <br /> 자, 이제 다시 WinDbg.exe를 실행시키고, "Local" 디버그를 선택하면, 다음과 같은 내용으로 Command 창이 뜹니다.<br /> <br /> <img alt="Symbol 로딩중" src="/SysWebRes/bbs/windbg_first_symbol_loading.png" /><br /> <br /> 위의 화면에서 잠시 멈춰있게 되는데, 바로 이 순간에 환경 변수에서 지정된 Microsoft의 Symbol 서버로부터 ntoskrnl.pdb 파일을 다운로드 받기 때문입니다. 물론, 한번 받은 이후에는 지정된 경로에 캐쉬될 것을 사용하므로 다음번에는 실행이 빠르게 이뤄집니다.<br /> <br /> 결국 최종적으로 다음과 같은 화면이 나와야 됩니다.<br /> <br /> <img alt="Symbol 이 정상적으로 지정되어 실행된 화면" src="/SysWebRes/bbs/windbg_with_symbol_loaded.png" /><br /> <br /> 자, 이제 하나 하나씩 명령어를 익혀 볼까요? ^^<br /> <br /> 우선, 현재 로드된 모듈의 목록을 보여주는 명령어로 "lm"이 있습니다.<br /> lm 명령어를 실행하게 되면, 다음과 같은 출력이 보여집니다.<br /> <br /> <pre class="code"> start end module name 80800000 80a6b000 nt (pdb symbols) \\sedona\d$\Symbol\OSSymbols\ntoskrnl.pdb\4106003FF97D4BCBA99245BF2172A8C12\ntoskrnl.pdb Unloaded modules: f8677000 f8685000 imapi.sys f7e40000 f7e54000 redbook.sys f873f000 f8747000 Sfloppy.SYS </pre> <br /> 보시는 것처럼, ntoskrnl.exe 모듈의 경우 정상적으로 pdb 파일이 로드되었음을 확인할 수 있습니다. <br /> <br /> 자, 이제 오늘의 본래 목표였던 커널에서 사용되고 있는 구조체의 값을 확인하는 것을 보도록 하겠습니다. 여기서 2번째 명령어로 "dt" (display type) 명령어를 익히겠습니다. 다음과 같이 명령어를 입력하면,<br /> <br /> dt _eprocess<br /> <br /> 위의 명령은, _EPROCESS 구조체의 구조를 출력하라는 것입니다. 따라서 다음과 같은 출력 결과가 나옵니다.<br /> <br /> <pre class="code"> nt!_EPROCESS +0x000 Pcb : _KPROCESS +0x078 ProcessLock : _EX_PUSH_LOCK +0x080 CreateTime : _LARGE_INTEGER +0x088 ExitTime : _LARGE_INTEGER +0x090 RundownProtect : _EX_RUNDOWN_REF +0x094 UniqueProcessId : Ptr32 Void +0x098 ActiveProcessLinks : _LIST_ENTRY +0x0a0 QuotaUsage : [3] Uint4B +0x0ac QuotaPeak : [3] Uint4B +0x0b8 CommitCharge : Uint4B +0x0bc PeakVirtualSize : Uint4B +0x0c0 VirtualSize : Uint4B +0x0c4 SessionProcessLinks : _LIST_ENTRY +0x0cc DebugPort : Ptr32 Void +0x0d0 ExceptionPort : Ptr32 Void +0x0d4 ObjectTable : Ptr32 _HANDLE_TABLE +0x0d8 Token : _EX_FAST_REF +0x0dc WorkingSetPage : Uint4B +0x0e0 AddressCreationLock : _KGUARDED_MUTEX +0x100 HyperSpaceLock : Uint4B +0x104 ForkInProgress : Ptr32 _ETHREAD +0x108 HardwareTrigger : Uint4B +0x10c PhysicalVadRoot : Ptr32 _MM_AVL_TABLE +0x110 CloneRoot : Ptr32 Void +0x114 NumberOfPrivatePages : Uint4B +0x118 NumberOfLockedPages : Uint4B +0x11c Win32Process : Ptr32 Void +0x120 Job : Ptr32 _EJOB +0x124 SectionObject : Ptr32 Void +0x128 SectionBaseAddress : Ptr32 Void +0x12c QuotaBlock : Ptr32 _EPROCESS_QUOTA_BLOCK +0x130 WorkingSetWatch : Ptr32 _PAGEFAULT_HISTORY +0x134 Win32WindowStation : Ptr32 Void +0x138 InheritedFromUniqueProcessId : Ptr32 Void +0x13c LdtInformation : Ptr32 Void +0x140 VadFreeHint : Ptr32 Void +0x144 VdmObjects : Ptr32 Void +0x148 DeviceMap : Ptr32 Void +0x14c Spare0 : [3] Ptr32 Void +0x158 PageDirectoryPte : _HARDWARE_PTE +0x158 Filler : Uint8B +0x160 Session : Ptr32 Void +0x164 ImageFileName : [16] UChar +0x174 JobLinks : _LIST_ENTRY +0x17c LockedPagesList : Ptr32 Void +0x180 ThreadListHead : _LIST_ENTRY +0x188 SecurityPort : Ptr32 Void +0x18c PaeTop : Ptr32 Void +0x190 ActiveThreads : Uint4B +0x194 GrantedAccess : Uint4B +0x198 DefaultHardErrorProcessing : Uint4B +0x19c LastThreadExitStatus : Int4B +0x1a0 Peb : Ptr32 _PEB +0x1a4 PrefetchTrace : _EX_FAST_REF +0x1a8 ReadOperationCount : _LARGE_INTEGER +0x1b0 WriteOperationCount : _LARGE_INTEGER +0x1b8 OtherOperationCount : _LARGE_INTEGER +0x1c0 ReadTransferCount : _LARGE_INTEGER +0x1c8 WriteTransferCount : _LARGE_INTEGER +0x1d0 OtherTransferCount : _LARGE_INTEGER +0x1d8 CommitChargeLimit : Uint4B +0x1dc CommitChargePeak : Uint4B +0x1e0 AweInfo : Ptr32 Void +0x1e4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO +0x1e8 Vm : _MMSUPPORT +0x230 MmProcessLinks : _LIST_ENTRY +0x238 ModifiedPageCount : Uint4B +0x23c JobStatus : Uint4B +0x240 Flags : Uint4B +0x240 CreateReported : Pos 0, 1 Bit +0x240 NoDebugInherit : Pos 1, 1 Bit +0x240 ProcessExiting : Pos 2, 1 Bit +0x240 ProcessDelete : Pos 3, 1 Bit +0x240 Wow64SplitPages : Pos 4, 1 Bit +0x240 VmDeleted : Pos 5, 1 Bit +0x240 OutswapEnabled : Pos 6, 1 Bit +0x240 Outswapped : Pos 7, 1 Bit +0x240 ForkFailed : Pos 8, 1 Bit +0x240 Wow64VaSpace4Gb : Pos 9, 1 Bit +0x240 AddressSpaceInitialized : Pos 10, 2 Bits +0x240 SetTimerResolution : Pos 12, 1 Bit +0x240 BreakOnTermination : Pos 13, 1 Bit +0x240 SessionCreationUnderway : Pos 14, 1 Bit +0x240 WriteWatch : Pos 15, 1 Bit +0x240 ProcessInSession : Pos 16, 1 Bit +0x240 OverrideAddressSpace : Pos 17, 1 Bit +0x240 HasAddressSpace : Pos 18, 1 Bit +0x240 LaunchPrefetched : Pos 19, 1 Bit +0x240 InjectInpageErrors : Pos 20, 1 Bit +0x240 VmTopDown : Pos 21, 1 Bit +0x240 ImageNotifyDone : Pos 22, 1 Bit +0x240 PdeUpdateNeeded : Pos 23, 1 Bit +0x240 VdmAllowed : Pos 24, 1 Bit +0x240 SmapAllowed : Pos 25, 1 Bit +0x240 CreateFailed : Pos 26, 1 Bit +0x240 DefaultIoPriority : Pos 27, 3 Bits +0x240 Spare1 : Pos 30, 1 Bit +0x240 Spare2 : Pos 31, 1 Bit +0x244 ExitStatus : Int4B +0x248 NextPageColor : Uint2B +0x24a SubSystemMinorVersion : UChar +0x24b SubSystemMajorVersion : UChar +0x24a SubSystemVersion : Uint2B +0x24c PriorityClass : UChar +0x250 VadRoot : _MM_AVL_TABLE +0x270 Cookie : Uint4B </pre> <br /> 와... ^^ 프로세스 구조를 알아냈으니, 스레드 구조도 알아보겠습니다. 다음과 같이 실행시키면 됩니다.<br /> <br /> dt _ethread<br /> <br /> 오늘은, 여기까지.
첨부파일
스팸 방지용 인증 번호
1085
(왼쪽의 숫자를 입력해야 합니다.)