windows debugging technique #3

59
서서서 서서서 http://www.debuglab.com http://www.debuglab.com 서서서 서서서 ([email protected]) ([email protected]) Go to Debugging World #3 Go to Debugging World #3 - Managed - Managed Debugging, Debugging, WinDbg WinDbg

Upload: steve-seo-wooseok-seo

Post on 16-Apr-2017

271 views

Category:

Software


7 download

TRANSCRIPT

Page 1: Windows Debugging Technique #3

서우석서우석http://www.debuglab.comhttp://www.debuglab.com 운영자운영자([email protected])([email protected])

Go to Debugging World #3Go to Debugging World #3 - Managed - Managed Debugging, WinDbgDebugging, WinDbg

Page 2: Windows Debugging Technique #3

AgendaAgenda Visual Studio .NET DebuggingVisual Studio .NET Debugging Symbol Server Symbol Server 설정설정 WinDBG WinDBG 사용하기사용하기 Debugging War StoryDebugging War Story DebuggerDebugger 의 작동 원리의 작동 원리 Debugging Tips & TricksDebugging Tips & Tricks

Page 3: Windows Debugging Technique #3

누구를 위한 웹 캐스트인가누구를 위한 웹 캐스트인가 ?? VS .NET VS .NET 디버깅이 궁금한 개발자디버깅이 궁금한 개발자 심볼 서버를 사용해보지 않은 개발자심볼 서버를 사용해보지 않은 개발자 심볼 서버 설정에 어려움을 겪고 있는 심볼 서버 설정에 어려움을 겪고 있는

개발자개발자 심볼 서버로부터 도움을 받지 못하고 있는 심볼 서버로부터 도움을 받지 못하고 있는

개발자개발자 WinDBGWinDBG 를 실행해도 뭐가 뭔지 를 실행해도 뭐가 뭔지

모르겠다는 개발자모르겠다는 개발자

Page 4: Windows Debugging Technique #3

VS.NET DebuggingVS.NET Debugging Managed?Managed?

메모리 충돌이나 누수와 같은 문제들이 자동 메모리 충돌이나 누수와 같은 문제들이 자동 해결해결 (Garbage Collector)(Garbage Collector)

기본적인 작동 방식은 기본적인 작동 방식은 VS 6.0VS 6.0 의 디버거와 의 디버거와 동일동일

스크립트스크립트 , Microsoft Active Server , Microsoft Active Server Pages(ASP), Microsoft ASP.NET, .NET, Pages(ASP), Microsoft ASP.NET, .NET, XML XML 웹 서비스웹 서비스 , , 네이티브 코드네이티브 코드 , SQL , SQL 디버깅을 하나의 디버깅을 하나의 UIUI 에서 디버깅 가능에서 디버깅 가능 !!

Page 5: Windows Debugging Technique #3

중단점 사용 팁중단점 사용 팁 고급 중단점을 사용하기 전에 한 단계씩 고급 중단점을 사용하기 전에 한 단계씩

코드 실행 명령으로 디버깅을 시작하는 코드 실행 명령으로 디버깅을 시작하는 것이 좋음것이 좋음

중단점 창을 띄워 놓고 디버깅하는 것이 중단점 창을 띄워 놓고 디버깅하는 것이 좋음좋음

호출 스택에서 중단점 설정 가능호출 스택에서 중단점 설정 가능 일회성 중단점 일회성 중단점 : <: < 커서까지 실행커서까지 실행 >> 하위 표현식에 중단점 설정 가능하위 표현식에 중단점 설정 가능

for ( i = 0 , m = 0 ; i < 10 ; i++ , m-- )for ( i = 0 , m = 0 ; i < 10 ; i++ , m-- )

Page 6: Windows Debugging Technique #3

중단점 사용 팁중단점 사용 팁 새 중단점 창에서 클래스와 메서드 직접 새 중단점 창에서 클래스와 메서드 직접

입력입력 MyThreadClass.ThreadFunc ( C# )MyThreadClass.ThreadFunc ( C# ) 오버로드된 메서드는 중단점 활성화 선택 가오버로드된 메서드는 중단점 활성화 선택 가

능능 !! 찾기 콤보 상자에서 메서드를 입력한 후찾기 콤보 상자에서 메서드를 입력한 후 , ,

<F9><F9> 를 눌러 중단점 설정 가능를 눌러 중단점 설정 가능 한 줄에 하나 이상의 중단점 설정 가능한 줄에 하나 이상의 중단점 설정 가능

Page 7: Windows Debugging Technique #3

Basic BPsBasic BPs

DemoDemo

Page 8: Windows Debugging Technique #3

조사식 창조사식 창 변수의 값을 확인하는 것은 기본변수의 값을 확인하는 것은 기본 ! + ! + 모든 모든

표현식에 대한 결과를 확인할 수 있음표현식에 대한 결과를 확인할 수 있음 메서드 호출 가능메서드 호출 가능 !!

여러 구조체의 데이터를 검증하기 위한 검증 여러 구조체의 데이터를 검증하기 위한 검증 메서드를 만들어서 필요할 때마다 호출 가능메서드를 만들어서 필요할 때마다 호출 가능

Page 9: Windows Debugging Technique #3

특성을 이용한 디버깅특성을 이용한 디버깅 DebuggerStepThroughAttributeDebuggerStepThroughAttribute

무조건 프로시저 단위 실행 명령 적용무조건 프로시저 단위 실행 명령 적용 getget 이나 이나 set set 액세서처럼 한 줄짜리 코드를 액세서처럼 한 줄짜리 코드를

사용하는 경우에 유용사용하는 경우에 유용 DebuggerHiddenAttributeDebuggerHiddenAttribute

중단점 설정 불가능중단점 설정 불가능 메서드를 완전히 숨길 수 있다메서드를 완전히 숨길 수 있다 .. Anti-Debugging Anti-Debugging 기술은 아니다기술은 아니다 ..

왜왜 ? ? 이 특성은 이 특성은 VS.NET VS.NET 디버거와 디버거와 DBGCLR.EXEDBGCLR.EXE에서 사용하지만 에서 사용하지만 CORDBG.EXECORDBG.EXE 에서는 사용하지 에서는 사용하지 않음않음

Page 10: Windows Debugging Technique #3

혼합 모드 디버깅혼합 모드 디버깅 VS.NET VS.NET 디버거는 디버거는 Native Native 코드와 코드와 Managed Managed

코드를 동시에 디버깅할 수 있음코드를 동시에 디버깅할 수 있음 일반적으로 각자 따로 디버깅하는 것이 좋음일반적으로 각자 따로 디버깅하는 것이 좋음

장점장점 하나의 하나의 UIUI 에서 모든 작업을 진행에서 모든 작업을 진행

단점단점 매우 느릴 수 있다매우 느릴 수 있다 .. 데이터 중단점 사용 불가데이터 중단점 사용 불가 디버거가 디버거가 Native Native 코드 쪽에 위치하고 있지 않다면코드 쪽에 위치하고 있지 않다면 , ,

해당 프로세스에 대한 미니 덤프 생성 불가해당 프로세스에 대한 미니 덤프 생성 불가 팁팁

옵션에서 옵션에서 ‘‘ 변수 창에서 속성 확인 허용변수 창에서 속성 확인 허용’’ 을 을 UncheckUncheck

Page 11: Windows Debugging Technique #3

심볼심볼 (Symbol)(Symbol) .dll.dll 이나 이나 .exe.exe 이 작성될 때 생성됨이 작성될 때 생성됨 확장자가 확장자가 .dbg.dbg 혹은 혹은 .pdb.pdb 함수 이름과 변수 이름과 같은 심볼 정보 함수 이름과 변수 이름과 같은 심볼 정보

포함포함 Windows Windows 디버거와 디버거와 Microsoft Visual Microsoft Visual

Studio .NET Studio .NET 디버거와 같은 디버거가 호출 디버거와 같은 디버거가 호출 스택을 보여주기 위해서 사용스택을 보여주기 위해서 사용

Page 12: Windows Debugging Technique #3

Symchk Symchk 툴툴 Debugging Tools for WindowsDebugging Tools for Windows 에 에

포함되어 있음포함되어 있음 ((http://www.microsoft.com/http://www.microsoft.com/ddkddk/debugging//debugging/))

명령줄에서 실행 가능명령줄에서 실행 가능 (( 경로 설정 필요경로 설정 필요 )) 예예

symchk /r c:\windows\system32 /s srv*c:\symchk /r c:\windows\system32 /s srv*c:\ossymbols*http://msdl.microsoft.com/dowossymbols*http://msdl.microsoft.com/download/symbolsnload/symbols

Page 13: Windows Debugging Technique #3

OS OS 심볼 서버심볼 서버 VS 7.1VS 7.1 부터 지원부터 지원 7.07.0 에서도 가능에서도 가능

symsrv.dll symsrv.dll 다운로드다운로드 symsrv.dllsymsrv.dll 을 을 devenv.exe devenv.exe 폴더에 복사폴더에 복사 ““srv*” -> “symsrv*symsrv.dll*”srv*” -> “symsrv*symsrv.dll*”

심볼 저장소로부터 자동으로 심볼 저장소로부터 자동으로 PDB PDB 파일 검사파일 검사 자동으로 바이너리 파일 검사자동으로 바이너리 파일 검사 심볼 경로 문법은 다소 난해심볼 경로 문법은 다소 난해 심볼 서버 설정 후심볼 서버 설정 후 , , 심볼을 다운로드하기 때문심볼을 다운로드하기 때문

에에 , , 프로그램 시작이 다소 지연됨프로그램 시작이 다소 지연됨 symchk symchk /r/r c:\windows\system32 /s SRV*c:\ c:\windows\system32 /s SRV*c:\

ossymbols*http://msdl.microsoft.com/download/sossymbols*http://msdl.microsoft.com/download/symbolsymbols

Page 14: Windows Debugging Technique #3

OS OS 심볼 서버 경로 지정 방법심볼 서버 경로 지정 방법 srv*[srv*[ 로컬캐시로컬캐시 **]] 원격저장소위치원격저장소위치 Project/Properties/Symbol PathProject/Properties/Symbol Path 에 에

입력한다입력한다 .. minidump minidump 사용시에는 사용시에는 MODPATH= MODPATH=

인자로 넣는다인자로 넣는다 .. 로컬 캐시를 사용하면 다음번 디버깅시에 로컬 캐시를 사용하면 다음번 디버깅시에

보다 빠르게 사용할 수 있다보다 빠르게 사용할 수 있다 .. 원격 경로는 네트워크 주소 및 인터넷 원격 경로는 네트워크 주소 및 인터넷

주소로 지정한다주소로 지정한다 ..

Page 15: Windows Debugging Technique #3

OS OS 심볼 서버 경로 지정 순서심볼 서버 경로 지정 순서 서버로 사용할 컴퓨터 설정서버로 사용할 컴퓨터 설정

예예 ) ) \\SYMBOLS\\SYMBOLS OSSYMBOLS OSSYMBOLS 이름으로 공유 폴더 생성이름으로 공유 폴더 생성 Debugging Tools for Windows Debugging Tools for Windows 설치 후설치 후 , ,

PATH PATH 환경 변수에 디렉터리 추가환경 변수에 디렉터리 추가 프락시 서버 환경이라면 프락시 서버 환경이라면

_NT_SYMBOL_PROXY _NT_SYMBOL_PROXY 환경 변수 설정환경 변수 설정 _NT_SYMBOL_PATH _NT_SYMBOL_PATH 환경 변수 설정환경 변수 설정

Page 16: Windows Debugging Technique #3

제품 심볼 서버 설정제품 심볼 서버 설정 서버로 사용할 컴퓨터 설정서버로 사용할 컴퓨터 설정

예예 ) ) \\SYMBOLS\\SYMBOLS PRODUCTSYMBOLS PRODUCTSYMBOLS 이름으로 공유 폴더 이름으로 공유 폴더

생성생성 symstore add /r /f d:\build\*.* /s \\symstore add /r /f d:\build\*.* /s \\

SYMBOLS\productsymbols /t SYMBOLS\productsymbols /t “MyApp” /v “Build 632” /c “2004/09/14 “MyApp” /v “Build 632” /c “2004/09/14 Daily Build”Daily Build”

삭제 시에는 트랜잭션 삭제 시에는 트랜잭션 ID ID 사용사용 symstore del /I 00000009 /s \\symbols\symstore del /I 00000009 /s \\symbols\

productsymbolsproductsymbols

Page 17: Windows Debugging Technique #3

Symbol Symbol 서버 설정서버 설정Notepad Notepad 디버깅디버깅OSSymbolTestOSSymbolTestProductSymbolTestProductSymbolTest

DemoDemo

Page 18: Windows Debugging Technique #3

참고자료참고자료 HOW TO: Use a Symbol Server with the HOW TO: Use a Symbol Server with the

Visual Studio .NET DebuggerVisual Studio .NET Debugger http://http://support.microsoft.comsupport.microsoft.com/?id=319037/?id=319037

Bugslalyer : Symbols and Crash DumpsBugslalyer : Symbols and Crash Dumps http://msdn.microsoft.com/msdnmag/issuehttp://msdn.microsoft.com/msdnmag/issue

s/02/06/Bugslayer/s/02/06/Bugslayer/ WinDBGWinDBG

Symbols Symbols 섹션섹션

Page 19: Windows Debugging Technique #3

WinDBG WinDBG 사용사용 WinDBGWinDBG 문서 필독문서 필독 WinDBGWinDBG 기능기능

WinDBG WinDBG 설정 및 사용설정 및 사용 WinDBGWinDBG 는 심볼의 로드되는 경로설정을 위한 다양한 는 심볼의 로드되는 경로설정을 위한 다양한

방법제공방법제공 다중 프로세스 디버깅다중 프로세스 디버깅 BreakPoint BreakPoint 와 와 exception exception 제어제어 WinDBG commandsWinDBG commands

덤프파일 디버깅덤프파일 디버깅 VS.NET : VS.NET : 개발한 컴퓨터에서 생성된 덤프파일만 작동개발한 컴퓨터에서 생성된 덤프파일만 작동 WinDBG : WinDBG : 고객으로부터 생성된 덤프파일도 가능고객으로부터 생성된 덤프파일도 가능

SOSSOS ManagedManaged 와 와 nativenative 가 혼합된 가 혼합된 applicationapplication 의 유일한 디버깅 의 유일한 디버깅

방법방법

Page 20: Windows Debugging Technique #3

WinDBGWinDBG 가 무엇인가가 무엇인가 ?? 탄생배경 탄생배경 : : OSOS 의 의 debugging debugging 자동화를 위함자동화를 위함 VS.NET VS.NET 디버거디버거 , , WinDBGWinDBG

VS.NET VS.NET 디버거는 응용 어플리케이션 개발자디버거는 응용 어플리케이션 개발자 WinDBGWinDBG 는 운영체계를 다루는 개발자를 위함는 운영체계를 다루는 개발자를 위함

Device driver Device driver 및 및 user mode native appuser mode native app 에도 막강한 기능 에도 막강한 기능 사용가능사용가능

다양한 다양한 process process 정보 정보 -> -> 어렵게 만드는 요인어렵게 만드는 요인 ?? Memory breakpointMemory breakpoint Mini-dumpMini-dump 를 다룰 수 있도록 향상된 바이너리 제공를 다룰 수 있도록 향상된 바이너리 제공 완전한 운영체제의 완전한 운영체제의 heap, processheap, process 의 의 handlehandle 정보를 볼 수 정보를 볼 수

있음있음 Install dirInstall dir 의 의 dubugger.chmdubugger.chm 의 도움말 파일의 도움말 파일 UIUI 는 단순히 는 단순히 DBGENG.DLLDBGENG.DLL 을 감싸는 정도이며 을 감싸는 정도이며 NTSD(ms NTSD(ms

symbolic debugger)symbolic debugger) 와 비슷하므로 와 비슷하므로 winDBGwinDBG 를 익히면 를 익히면 NTSDNTSD 도 쉽게 익힐 수 있음도 쉽게 익힐 수 있음

Page 21: Windows Debugging Technique #3

WinDBG WinDBG 설치설치 Download pageDownload page

http://www.microsoft.com/whdc/devtools/dhttp://www.microsoft.com/whdc/devtools/debugging/installx86.mspxebugging/installx86.mspx

Overview pageOverview page http://www.microsoft.com/http://www.microsoft.com/

whdc/devtools/debugging/default.mspxwhdc/devtools/debugging/default.mspx

Page 22: Windows Debugging Technique #3

WinDBG WinDBG 설정설정 VS.NET symbol serverVS.NET symbol server

VS.NET symbolVS.NET symbol 서버 설정 서버 설정 -> -> WinDBGWinDBG 는 자동으로 는 자동으로 __NT_SYMBOL_PATHNT_SYMBOL_PATH 환경변수를 기본 심볼경로로 환경변수를 기본 심볼경로로 사용사용

공통 소스파일을 찾기 위한 작업 필요공통 소스파일을 찾기 위한 작업 필요 __NT_SOURCE_PATH NT_SOURCE_PATH 환경변수 등록환경변수 등록 WinDBGWinDBG 를 열고 를 열고 source search pathsource search path 에 필요정보 입력에 필요정보 입력

WinDBGWinDBG 가 바이너리 파일을 찾기 위한 실행파일 가 바이너리 파일을 찾기 위한 실행파일 이미지 경로 설정이미지 경로 설정 File-Image File PathFile-Image File Path 를 이용해 설정 를 이용해 설정 : : 개발자개발자 , , 고객의 고객의

dumpdump Command Command 창에 기본 워크스페이스에 색상정보 창에 기본 워크스페이스에 색상정보

입력입력 엄청난 정보중에 엄청난 정보중에 TRACE, OutputDebugStringTRACE, OutputDebugString등의 등의

정보만을 선택하기 위한 작업 정보만을 선택하기 위한 작업 -> -> Debuggee Level Debuggee Level Command Window Text Command Window Text 항목을 이용해 색상 조정항목을 이용해 색상 조정

Page 23: Windows Debugging Technique #3

WinDBGWinDBG commandscommands WinDBGWinDBG commands commands 종류 종류 / / 특징특징

일반명령일반명령 디버기 제어 디버기 제어 : : 추정추정 , , 단계실행단계실행 , , 메모리 확인등등메모리 확인등등

메타명령메타명령 (.(. 명령명령 )) 디버거와 디버깅 방법 제어 디버거와 디버깅 방법 제어 : : 로그파일생성로그파일생성 , ,

프로세스 연결프로세스 연결 , , 덤프파일 작성 등등덤프파일 작성 등등 확장명령확장명령

디버기를 제어하고 현재 상태분석 디버기를 제어하고 현재 상태분석 : : 덤프처리덤프처리 , , 임계세션 분석임계세션 분석 , , 충돌분석 등등충돌분석 등등

일반일반 , , 메타 명령은 대소문자 구별 메타 명령은 대소문자 구별 X, X, 확장 확장 명령 구분명령 구분

Command Command 창의 창의 lm, .help , !symlm, .help , !sym

Page 24: Windows Debugging Technique #3

심볼 로드심볼 로드 WinDGB WinDGB 심볼처리 우수함심볼처리 우수함

VS.NETVS.NET 보다 심볼처리 뛰어나며 보다 심볼처리 뛰어나며 VS.NETVS.NET 은 은 로드된 심볼을 확인할 수 없으므로 필자는 로드된 심볼을 확인할 수 없으므로 필자는 VS.NETVS.NET 을 사용하기 전에 을 사용하기 전에 WinDBGWinDBG 를 를 이용한다고함이용한다고함 ((winDBGwinDBG 의 의 lm lm 으로 확인 가으로 확인 가능능 )) Lm v m : v-Lm v m : v- 자세한 정보자세한 정보 , , m-modulem-module

AnytimeAnytime Lazy symbol loading(save memory)Lazy symbol loading(save memory)

Ex) kernel debugging Ex) kernel debugging 시 시 NTDLL.DLLNTDLL.DLL 만 로딩만 로딩 LD(load symbol) : LD(load symbol) : 강제 로딩강제 로딩

실행파일을 실행파일을 loadload 할 경우 할 경우 buildbuild 를 를 //checksumchecksum으로 하여야 함으로 하여야 함

..load load 확장 확장 dlldll 과 혼돈하지 말자과 혼돈하지 말자

Page 25: Windows Debugging Technique #3

Process & ThreadProcess & Thread Multi-process debuggingMulti-process debugging

VS.NET, WinDBG VS.NET, WinDBG 모두 가능모두 가능 WinDBGWinDBG 가 가 process controlprocess control 이 더 우수함이 더 우수함

CommandsCommands .childdbg option .childdbg option 변경변경 | : | : process statusprocess status

. : . : 활성화된 활성화된 processprocess # : WinDBG# : WinDBG 에서 실행을 중단하기위해 예외를 발생시킨 에서 실행을 중단하기위해 예외를 발생시킨

processprocess ~ : thread status~ : thread status

..create c:\winnt\system32\sol.execreate c:\winnt\system32\sol.exe .attach : tlist->.attach : tlist-> 실행 중 실행 중 process attachprocess attach

Child process debugging exampleChild process debugging example

Page 26: Windows Debugging Technique #3

실행실행 , , 단계 실행단계 실행 , , 추적추적 WinDBGWinDBG 의 의 G(go), T(trace), P(step)G(go), T(trace), P(step)

F5F5 로 실행은 하거나 로 실행은 하거나 shift + F11shift + F11등의 단축키는 등의 단축키는 g, t g, t 등의 명령을 수행하는 것 뿐임등의 명령을 수행하는 것 뿐임

데이터 추적데이터 추적 , , 조사조사 ((p443)p443) DV : DV : 변수의 값변수의 값 , , DT : DT : 변수 변수 typetype 성능과 관련된 문제를 해결할 경우 예를 들어 성능과 관련된 문제를 해결할 경우 예를 들어 STLSTL

같은 경우 같은 경우 debugdebug 가 어려움 가 어려움 -> -> wt(trace and watch wt(trace and watch data)data) 명령어에 시간을 투자해 연구해야 함명령어에 시간을 투자해 연구해야 함 , , 즉 즉 wtwt명령을 실행하면서 명령을 실행하면서 kernel modekernel mode 변환이 얼마나 변환이 얼마나 발생하는지 여부발생하는지 여부 (( 성능의 핵심성능의 핵심 )) 를 측정하여 를 측정하여 kmkm변환을 피하는 방법을 강구 변환을 피하는 방법을 강구 -> -> 성능 향상성능 향상

로그를 이용한 로그를 이용한 dump : .logopen(filename) , .logappend, .logclosedump : .logopen(filename) , .logappend, .logclose등의 등의 metameta 명령을 이용명령을 이용

Page 27: Windows Debugging Technique #3

실행실행 , , 단계 실행단계 실행 , , 추적추적 BreakpointBreakpoint

일반적인 일반적인 breakpointbreakpoint BP : memory addressBP : memory address 를 이용함를 이용함 BU : BU : 심볼을 이용함심볼을 이용함 BL : breakpoint listBL : breakpoint list BE, BD : breakpoint enable/disable BE, BD : breakpoint enable/disable J J 표현식표현식 ?? 참 명령참 명령 ;; 거짓 명령거짓 명령

Memory accessMemory access BA : BPBA : BP 인 인 memory addressmemory address 를 이용해 를 이용해 debuggingdebugging 을 하고 을 하고

DVDV 를 이용해 변수 주소를 확인해서 사용가능를 이용해 변수 주소를 확인해서 사용가능 예외와 이벤트예외와 이벤트

Access violationAccess violation 도 포함됨도 포함됨 CommandCommand 도 지원하지만 도 지원하지만 debug-event filters menudebug-event filters menu

이용 권장이용 권장 P451 P451 예외 브레이크 상태 참조예외 브레이크 상태 참조

Page 28: Windows Debugging Technique #3

WinDBG WinDBG 제어하기제어하기 추가적인 메타 명령들추가적인 메타 명령들

..cls : clear screencls : clear screen ..enable_unicode : unicodeenable_unicode : unicode .locale.locale .formats.formats .shell.shell .occommand : outputdebugstring.occommand : outputdebugstring 함수 함수

호출시 접두사 명시호출시 접두사 명시

Page 29: Windows Debugging Technique #3

확장 기능확장 기능 확장기능 로드확장기능 로드 , , 제어제어

..chainchain 으로 로드된 확장기능 검토으로 로드된 확장기능 검토 SOSSOS 를 를 loadload 하면 이 부분에 하면 이 부분에 SOS.dllSOS.dll 이 추가됨을 알 수 이 추가됨을 알 수

있음있음 ..load sos : .dllload sos : .dll 은 생략해야 함은 생략해야 함

..load, .unload load, .unload 로 확장 로 확장 dll load & unloaddll load & unload 중요한 확장 명령들중요한 확장 명령들

!!analyze –v : analyze –v : 현재 예외에 대한 간단한 분석정보현재 예외에 대한 간단한 분석정보 !!critsec critsec 주소 주소 : : 임계섹션임계섹션 !locks –v : !locks –v : 잠겨진 임계섹션 확인잠겨진 임계섹션 확인 !!token : threadtoken : thread 에 적용된 보안 정보에 적용된 보안 정보 !!handle : handle : 핸들을 포함하는 객체타입 및 요약정보핸들을 포함하는 객체타입 및 요약정보

메모리 메모리 leakleak, , deadlock debug deadlock debug 중요한 중요한 debugging debugging item(p457)item(p457)

Page 30: Windows Debugging Technique #3

덤프파일 생성하기덤프파일 생성하기 디버깅 도중 디버깅 도중 ..DUMP DUMP 명령으로 파일 생성명령으로 파일 생성

Ex) .dump /a/uEx) .dump /a/u c:\temp\aa.dmpc:\temp\aa.dmp 로 하면 실제 파일은 로 하면 실제 파일은 aa_2004-10-15_18-30-13-108_05E8.dmp aa_2004-10-15_18-30-13-108_05E8.dmp 로 생성로 생성

덤프파일 덤프파일 optionoption /u : /u : 날짜날짜 , , 시간시간 , , PIDPID 를 파일이름으로 추가함를 파일이름으로 추가함 //c : c : 자세한 정보자세한 정보 //a : loada : load 된 모든 프로세스에 대한 정보된 모든 프로세스에 대한 정보 //f : f : 현재 현재 thread stackthread stack 부터 부터 loadload 된 실제 된 실제 binarybinary 에 에

대한 메모리 데이터까지 모든 정보 포함대한 메모리 데이터까지 모든 정보 포함 /m : /m : 일반적인 일반적인 mini dump (vs.netmini dump (vs.net 과 동일과 동일 )) //b : dmpb : dmp 파일을 압축하여 파일을 압축하여 ..cabcab 파일 생성파일 생성

Page 31: Windows Debugging Technique #3

덤프파일 열기덤프파일 열기 방법방법

WinDBGWinDBG 의 메뉴 의 메뉴 ((open crash dump)open crash dump) 덤프파일을 열고 심볼덤프파일을 열고 심볼 , , 소스소스 , , 바이너리 경로 바이너리 경로

설정설정 단계단계

LM /vLM /v 를 이용해 로드된 심볼 확인 를 이용해 로드된 심볼 확인 : : 필요시 필요시 심볼 경로설정심볼 경로설정

이미지 경로 설정이미지 경로 설정 Windows hotfixWindows hotfix 의 경우 의 경우 OSSYMS.JSOSSYMS.JS 를 를

실행하여 심볼 저장소 다시 로드해아함실행하여 심볼 저장소 다시 로드해아함 .. 덤프 디버깅은 덤프 디버깅은 WinDBGWinDBG 사용법과 동일사용법과 동일

Page 32: Windows Debugging Technique #3

SOS(Son of Strike)SOS(Son of Strike) Dump debuggingDump debugging

Native application debugging : Native application debugging : 기능이 많은기능이 많은 Managed application : Managed application : 제약사항이 많음제약사항이 많음

Native appNative app 와 와 managed appmanaged app 를 동시에 를 동시에 가진 가진 app dump debuggingapp dump debugging 을 위해 을 위해 SOSSOS를 지원함를 지원함

위치 위치 : <.: <.net install dir>\sdk\v1.1\Tool net install dir>\sdk\v1.1\Tool developers guide\samples\sosdevelopers guide\samples\sos

상세한 내용은 상세한 내용은 sos.htm sos.htm 참조참조

Page 33: Windows Debugging Technique #3

SOS.dll loadSOS.dll load SOS SOS 는 는 ..NET FrameworkNET Framework 의 일부의 일부 Vsvars32.bat Vsvars32.bat 실행실행

..netnet 과 관련된 과 관련된 dir dir 경로에 포함되도록 환경설정경로에 포함되도록 환경설정 ..load sosload sos 실행실행

ExampleExample 책의 책의 sourcesource 의 의 exceptapp.exeexceptapp.exe !!threadthread 를 이용해 를 이용해 appDomainappDomain 의 정보를 알수있음의 정보를 알수있음 !!clrstack .allclrstack .all 을 이용해 을 이용해 stackstack 확인확인 !!dumpstack : .netdumpstack : .net 과 과 native native 호출이 많은 호출이 많은

프로그램을 다루는 프로그램을 다루는 appapp 의 호출 스택확인의 호출 스택확인 !!dumpclass : classdumpclass : class 의 모든 의 모든 data fielddata field 확인확인 ~~~~

Page 34: Windows Debugging Technique #3

디버깅 전쟁 이야기디버깅 전쟁 이야기 동료와 공유하기 위한 디버깅 과정 기술 동료와 공유하기 위한 디버깅 과정 기술

방법방법 사례 실습으로 적극 활용사례 실습으로 적극 활용 훌륭한 디버깅 팁으로 자료 공유훌륭한 디버깅 팁으로 자료 공유 John RobbinsJohn Robbins 가 처음 도입가 처음 도입

Page 35: Windows Debugging Technique #3

디버깅 전쟁 이야기 디버깅 전쟁 이야기 #1#1 사건 발단사건 발단

파일 생성이 되지 않는다파일 생성이 되지 않는다 !! 전개전개

fopenfopen 에서 오류가 발생하여 조사식 창에서 에서 오류가 발생하여 조사식 창에서 @err,hr@err,hr 을 입력하여 을 입력하여 Last Error Last Error 값 확인값 확인 ““ 파일의 경로를 찾을 수 없습니다파일의 경로를 찾을 수 없습니다 .”.” 분명히 파일의 경로에 문제가 있음분명히 파일의 경로에 문제가 있음 !!

파일을 여는 두 가지 방법파일을 여는 두 가지 방법 MFCMFC 의 의 SDI/MDISDI/MDI 에서 지원하는 에서 지원하는 [[최근에 사용한 파일최근에 사용한 파일 ] ]

메뉴 이용메뉴 이용 오류 발생하지 않음오류 발생하지 않음 !!

[[ 파일파일 ]-[]-[열기열기 ] ] 메뉴 이용메뉴 이용 오류 발생오류 발생 !!

Page 36: Windows Debugging Technique #3

디버깅 전쟁 이야기 디버깅 전쟁 이야기 #1#1 전개전개

상대 경로의 주소는 다음과 같이 선언되어 있음상대 경로의 주소는 다음과 같이 선언되어 있음 #define FILE_SAVE_PATH “Data/result.dat”#define FILE_SAVE_PATH “Data/result.dat”

상대 경로를 절대 경로로 바꾸니 성공상대 경로를 절대 경로로 바꾸니 성공 !! 분석분석

[[최근에 사용한 파일최근에 사용한 파일 ] ] 메뉴는 절대 경로를 메뉴는 절대 경로를 이용하는 방법이용하는 방법

[[ 파일파일 ]-[]-[열기열기 ] ] 사용시에는 프로그램의 실행 사용시에는 프로그램의 실행 경로가 파일을 열었던 경로로 바뀌어 버림경로가 파일을 열었던 경로로 바뀌어 버림

해결해결 프로그램 시작 시 실행 경로를 저장하여프로그램 시작 시 실행 경로를 저장하여 , , 상대 상대

경로가 필요할 때마다 저장된 경로를 이용하여 경로가 필요할 때마다 저장된 경로를 이용하여 절대 경로로 변환절대 경로로 변환

Page 37: Windows Debugging Technique #3

디버깅 전쟁 이야기 디버깅 전쟁 이야기 #1#1 교훈교훈

상대 경로를 이용하는 프로그램은 어떤 외부적인 상대 경로를 이용하는 프로그램은 어떤 외부적인 요인에 의해서 현재 경로가 바뀔 수 있음을 요인에 의해서 현재 경로가 바뀔 수 있음을 주의해야 함주의해야 함

디버깅을 하기 전에 여러 가지 테스트 케이스를 디버깅을 하기 전에 여러 가지 테스트 케이스를 미리 정해놓고 디버깅을 시작하는 것이 도움이 됨미리 정해놓고 디버깅을 시작하는 것이 도움이 됨

Page 38: Windows Debugging Technique #3

디버깅 전쟁 이야기 디버깅 전쟁 이야기 #2#2 사건 발단사건 발단

포인터의 값이 포인터의 값이 NULLNULL 이 되는 기이한 현상이 되는 기이한 현상 전개전개

MyStruct * pHead = (MyStruct *) malloc ( sizeof ( MyStruct ) ); MyStruct * pHead = (MyStruct *) malloc ( sizeof ( MyStruct ) ); int mystruct[10];int mystruct[10];

for ( int i = 0 ; i <= 10 ; i++ )for ( int i = 0 ; i <= 10 ; i++ ){{  mystruct[i] = 0;  mystruct[i] = 0;}}

pHead pHead 값이 값이 NULLNULL 로 설정로 설정 값을 확인하기 위하여 데이터 중단점 설정값을 확인하기 위하여 데이터 중단점 설정

Page 39: Windows Debugging Technique #3

디버깅 전쟁 이야기 디버깅 전쟁 이야기 #2#2 전개 전개 (( 계속계속 ))

Page 40: Windows Debugging Technique #3

디버깅 전쟁 이야기 디버깅 전쟁 이야기 #2#2 전개전개 (( 계속계속 ))

데이터 중단점을 통해서 변수의 값들을 확인데이터 중단점을 통해서 변수의 값들을 확인

교훈교훈 포인터 개념을 정확하게 이해하도록 하자포인터 개념을 정확하게 이해하도록 하자 .. 디버거의 기능을 충분히 활용하도록 하자디버거의 기능을 충분히 활용하도록 하자 ..

Page 41: Windows Debugging Technique #3

디버거 작동 원리디버거 작동 원리 Win32 Win32 디버거는 디버거는 WindowsWindows 의 기능을 의 기능을

사용한다사용한다 .. 요구 사항요구 사항

CreateProcessCreateProcess 의 의 dwCreationFlags dwCreationFlags 매개 매개 변수에 변수에 DEBUG_ONLY_THIS_PROCESS DEBUG_ONLY_THIS_PROCESS 설정설정

디버기를 시작하고 나서 디버기를 시작하고 나서 WaitForDebugEvent API WaitForDebugEvent API 함수를 호출하여 함수를 호출하여 루프로 진입루프로 진입

이벤트를 처리하고 난 후에는 이벤트를 처리하고 난 후에는 ContinueDebugEvent ContinueDebugEvent 함수 호출함수 호출

별도의 스레드로 실행별도의 스레드로 실행

Page 42: Windows Debugging Technique #3

디버거의 기본 골격 코드디버거의 기본 골격 코드void main ( void )void main ( void ){{

CreateProcess ( … , DEBUG_ONLY_THIS_PROCESS, … );CreateProcess ( … , DEBUG_ONLY_THIS_PROCESS, … );

while ( 1 == WaitForDebugEvent ( … ) )while ( 1 == WaitForDebugEvent ( … ) ){{if ( EXIT_PROCESS )if ( EXIT_PROCESS ){{break ;break ;}}ContinueDebugEvent ( … );ContinueDebugEvent ( … );}}

}}

Page 43: Windows Debugging Technique #3

디버깅 이벤트디버깅 이벤트 DEBUG_EVENT DEBUG_EVENT 구조체구조체 ((내부적으로 내부적으로

union union 구조구조 )) 에 모든 데이터가 들어옴에 모든 데이터가 들어옴 CREATE_PROCESS_DEBUG_EVENTCREATE_PROCESS_DEBUG_EVENT

새로운 프로세스가 디버깅되는 프로세스 새로운 프로세스가 디버깅되는 프로세스 내에서 생성될 때나 디버거가 이미 활성화되어 내에서 생성될 때나 디버거가 이미 활성화되어 있는 프로세스를 디버깅할 때마다 발생있는 프로세스를 디버깅할 때마다 발생

CREATE_THREAD_DEBUG_EVENTCREATE_THREAD_DEBUG_EVENT 새로운 스레드가 시작할 때 발생새로운 스레드가 시작할 때 발생

EXCEPTION_DEBUG_EVENTEXCEPTION_DEBUG_EVENT 디버기에서 예외가 발생할 때 발생디버기에서 예외가 발생할 때 발생

Page 44: Windows Debugging Technique #3

디버깅 이벤트디버깅 이벤트 EXIT_PROCESS_DEBUG_EVENTEXIT_PROCESS_DEBUG_EVENT

마지막 스레드가 디버거를 나갈 때나 마지막 스레드가 디버거를 나갈 때나 ExitProcess ExitProcess 함수를 호출할 때함수를 호출할 때

EXIT_THREAD_DEBUG_EVENTEXIT_THREAD_DEBUG_EVENT 디버기의 스레드가 종료할 때 발생디버기의 스레드가 종료할 때 발생 디버거가 이 핸들을 닫아서는 안됨디버거가 이 핸들을 닫아서는 안됨

LOAD_DLL_DEBUG_EVENTLOAD_DLL_DEBUG_EVENT 디버기가 디버기가 DLLDLL 을 로드할 때 발생을 로드할 때 발생

OUTPUT_DEBUG_STRING_EVENTOUTPUT_DEBUG_STRING_EVENT 디버기가 디버기가 OutputDebugString OutputDebugString 함수 호출할 때 발생함수 호출할 때 발생

UNLOAD_DLL_DEBUG_EVENTUNLOAD_DLL_DEBUG_EVENT 디버기가 디버기가 FreeLibraryFreeLibrary 로 로 DLLDLL 을 언로드할 때 발생을 언로드할 때 발생

Page 45: Windows Debugging Technique #3

디버거 작성 시 주의 사항디버거 작성 시 주의 사항 WriteProcessMemory WriteProcessMemory 함수를 호출하여 함수를 호출하여

디버기의 코드를 고치는 경우디버기의 코드를 고치는 경우 , , FlushInstructionCache FlushInstructionCache 함수를 호출하여 함수를 호출하여 업데이트 해주어야 함업데이트 해주어야 함

중단점이 활성화되면 중단점이 활성화되면 ContinueDebugEvent ContinueDebugEvent 함수를 호출해야 함수를 호출해야 한다한다 ..

Page 46: Windows Debugging Technique #3

MINDBGMINDBG

DemoDemo

Page 47: Windows Debugging Technique #3

Tips & TricksTips & Tricks

Page 48: Windows Debugging Technique #3

메모리 값의 의미메모리 값의 의미 0xAB, 0xABAB, 0xABABAB0xAB, 0xABAB, 0xABABAB

LocalAlloc()LocalAlloc() 에 의해서 할당된 메모리에 의해서 할당된 메모리 0xBAADF00D0xBAADF00D

LocalAlloc ( LMEM_FIXED, … )LocalAlloc ( LMEM_FIXED, … ) 에 의해서 할당된 메모리에 의해서 할당된 메모리 0xFEEE0xFEEE

HeapAlloc() HeapAlloc() 또는 또는 LocalAlloc()LocalAlloc() 에 의해서 할당된 메모리에 의해서 할당된 메모리 0xCC0xCC

/GZ /GZ 옵션을 사용한 경우옵션을 사용한 경우 , , 초기화 되지 않은 변수에 자동으로 할당되는 초기화 되지 않은 변수에 자동으로 할당되는 값값 (( 스택스택 ))

0xCD0xCD 메모리 누수를 검사하려고 할 때 사용된다메모리 누수를 검사하려고 할 때 사용된다 . . 일반적으로 일반적으로 DEBUG_NEWDEBUG_NEW

가 정의되어있을 때가 정의되어있을 때 . malloc(). malloc() 나 나 newnew 로 할당되는 값로 할당되는 값 0xDD0xDD

free() free() 나 나 deletedelete 로 해제된 값로 해제된 값 . . 사용하려는 값이 해제되었는지 사용하려는 값이 해제되었는지 확인하기 위해서 사용가능확인하기 위해서 사용가능

0xFD 0xFD DEBUG_NEWDEBUG_NEW 가 정의되어 있을 때가 정의되어 있을 때 , , 메모리 영역을 보호하기 위하여 메모리 영역을 보호하기 위하여

메모리 공간 앞뒤에 추가함메모리 공간 앞뒤에 추가함

Page 49: Windows Debugging Technique #3

디버거 자동 실행디버거 자동 실행 응용 프로그램이 시작하면서 디버거가 응용 프로그램이 시작하면서 디버거가

자동을 실행자동을 실행 Windows Windows 서비스와 서비스와 COM COM 아웃아웃 -- 오브오브 --

프로세스에서 유용프로세스에서 유용 HKEY_LOCAL_MACHINE\SOFTWARE\HKEY_LOCAL_MACHINE\SOFTWARE\

Microsoft\WindowsNT\CurrentVersion\Microsoft\WindowsNT\CurrentVersion\Image File Execution Options Image File Execution Options 키에서 키에서 응용 프로그램의 파일 이름과 동일 이름의 응용 프로그램의 파일 이름과 동일 이름의 키를 생성키를 생성 Debugger Debugger 문자열 값 문자열 값 : : 실행하고자 하는 실행하고자 하는

디버거의 전체 경로와 파일 이름 입력디버거의 전체 경로와 파일 이름 입력

Page 50: Windows Debugging Technique #3

배열의 특정 범위만 확인배열의 특정 범위만 확인 크기가 크기가 50005000 인 배열에서인 배열에서 , 2000, 2000 번째 부터 번째 부터

1010 개 요소만 확인하고 싶을때개 요소만 확인하고 싶을때 Char pFoo[5000];Char pFoo[5000]; Watch Watch 창에서 창에서 (pFoo + 2000) , 10(pFoo + 2000) , 10

Page 51: Windows Debugging Technique #3

DirectX DirectX 데이터 표시데이터 표시 Autoexp.datAutoexp.dat 에 추가에 추가

D3DXQUATERNION =x=<x> y=<y> z=<z> w=<w>D3DXQUATERNION =x=<x> y=<y> z=<z> w=<w>_D3DMATRIX =_11=<_11> _22=<_22> _33=<_33> _44=<_44>_D3DMATRIX =_11=<_11> _22=<_22> _33=<_33> _44=<_44>D3DXVECTOR4 =x=<x> y=<y> z=<z> w=<w>D3DXVECTOR4 =x=<x> y=<y> z=<z> w=<w>_D3DVECTOR =x=<x> y=<y> z=<z>_D3DVECTOR =x=<x> y=<y> z=<z>D3DXVECTOR2 =x=<x> y=<y>D3DXVECTOR2 =x=<x> y=<y>_D3DCOLORVALUE =r=<r> g=<g> b=<b> a=<a>_D3DCOLORVALUE =r=<r> g=<g> b=<b> a=<a>_D3DPRESENT_PARAMETERS_ =hwnd=<hDeviceWindow> _D3DPRESENT_PARAMETERS_ =hwnd=<hDeviceWindow>

Fmt=<BackBufferFormat> ZBuff=<EnableAutoDepthStencil> Fmt=<BackBufferFormat> ZBuff=<EnableAutoDepthStencil> _D3DDISPLAYMODE =w=<Width> h=<Height> Hz=<RefreshRate> _D3DDISPLAYMODE =w=<Width> h=<Height> Hz=<RefreshRate>

Fmt=<Format>Fmt=<Format>_D3DVIEWPORT8 =x=<x> y=<y> width=<Width> height=<Height>_D3DVIEWPORT8 =x=<x> y=<y> width=<Width> height=<Height>

(Visual C++ 6.0(Visual C++ 6.0 에서도 가능에서도 가능 ))

Page 52: Windows Debugging Technique #3

스레드 이름 설정스레드 이름 설정

typedef struct tagTHREADNAME_INFOtypedef struct tagTHREADNAME_INFO{{

DWORDDWORD dwType; dwType; // must be 0x1000// must be 0x1000LPCSTRLPCSTR szName;szName; // pointer to name (in user addr space)// pointer to name (in user addr space)DWORDDWORD dwThreadID;dwThreadID; // thread ID (-1=caller thread)// thread ID (-1=caller thread)DWORDDWORD dwFlags;dwFlags; // reserved for future use, must be zero// reserved for future use, must be zero

} THREADNAME_INFO;} THREADNAME_INFO;

void SetThreadName( DWORD dwThread, LPCSTR szThreadName, DWORD dwFlags )void SetThreadName( DWORD dwThread, LPCSTR szThreadName, DWORD dwFlags ){{

THREADNAME_INFO info;THREADNAME_INFO info;info.dwType = 0x1000;info.dwType = 0x1000;info.szName = szThreadName;info.szName = szThreadName;info.dwThreadID = dwThread;info.dwThreadID = dwThread;info.dwFlags = dwFlags;info.dwFlags = dwFlags;

__try__try{{RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD), (DWORD*)&info );}}__except(EXCEPTION_CONTINUE_EXECUTION)__except(EXCEPTION_CONTINUE_EXECUTION){{}}

}}

Page 53: Windows Debugging Technique #3

콘솔 콘솔 TRACETRACE 제품 디버깅 시에도 활용 가능제품 디버깅 시에도 활용 가능 AllocConsoleAllocConsole 와 와 FreeConsole API FreeConsole API 활용활용 프로그램의 상태를 확인하기 위하여 실행 프로그램의 상태를 확인하기 위하여 실행

옵션 이용옵션 이용

Page 54: Windows Debugging Technique #3

SP2SP2 에서의 원격 디버깅에서의 원격 디버깅 DCOM DCOM 설정설정 (Visual Studio Computer)(Visual Studio Computer)

DCOMCNFG DCOMCNFG 실행실행 Component Services Component Services 컴퓨터 컴퓨터 내 컴퓨터 클릭후에 내 컴퓨터 내 컴퓨터 클릭후에 내 컴퓨터

구성 버튼 클릭구성 버튼 클릭 기본 기본 COM COM 보안 탭에서 액세스 권한에 보안 탭에서 액세스 권한에 ANONYMOUS LOGON ANONYMOUS LOGON

추가 후추가 후 , , 원격 접속 권한 허용원격 접속 권한 허용 Windows Windows 방화벽 설정방화벽 설정 (VS(VS 와 원격 모두와 원격 모두 ))

DebuggerFirewallConfiguration.exe DebuggerFirewallConfiguration.exe 파일 다운로드파일 다운로드 ASP, ASP.NET, ATL ASP, ASP.NET, ATL 서버 디버깅서버 디버깅

Enable Web Server Debugging : Enable Web Server Debugging : KB 833977KB 833977 스크립트 디버깅스크립트 디버깅

Enable Script Debugging : Enable Script Debugging : KB 833977KB 833977 원격 원격 T-SQL T-SQL 디버깅디버깅

현재로서는 불가능현재로서는 불가능 , SP , SP 제공 후 지원 가능제공 후 지원 가능 관리자 권한을 갖고 있지 않은 개발자관리자 권한을 갖고 있지 않은 개발자

Run the debugger as a normal user : Run the debugger as a normal user : KB 833977KB 833977

Page 55: Windows Debugging Technique #3

프로세스 다루기프로세스 다루기 Process KillProcess Kill

작업 관리자작업 관리자 , Process Explorer, , Process Explorer, Taskkill(Windows XP+)Taskkill(Windows XP+)

우선 순위 다루기우선 순위 다루기 ntsd taskmgrntsd taskmgr 로 로 SeDebugPrivilege SeDebugPrivilege 획득획득

ntsd –hd –c “qd” taskmgrntsd –hd –c “qd” taskmgr -hd : -hd : 일반 힙 사용일반 힙 사용 -c : -c : 첫번째 명령 실행첫번째 명령 실행

Page 56: Windows Debugging Technique #3

실행 순서 확인실행 순서 확인 Managed Managed 응용 프로그램의 실행 순서 확인응용 프로그램의 실행 순서 확인

프로그램의 전체적인 흐름을 살펴볼 수 있다프로그램의 전체적인 흐름을 살펴볼 수 있다 .. 프로파일링프로파일링 (Profiling)(Profiling) 과 같은 기능과 같은 기능 CORDBG.EXECORDBG.EXE 의 의 wt wt 명령명령

(cordbg) wt(cordbg) wt1 App::Main1 App::Main3 App::Foo3 App::Foo3 App::Bar3 App::Bar5 App::Baz5 App::Baz3 App::Bar3 App::Bar3 App::Foo3 App::Foo3 App::Main3 App::Main21 instructions total21 instructions total

Page 57: Windows Debugging Technique #3

디버그 디버그 FA-KBFA-KB Debugger slow to startupDebugger slow to startup

312115, XDK pre-Feb 2003, IIS Admin312115, XDK pre-Feb 2003, IIS Admin Crash on Attach to ProcessCrash on Attach to Process

324879324879 Trouble reading 6.0 pdbsTrouble reading 6.0 pdbs

318135318135 Stepping in C# not accurateStepping in C# not accurate

316834 (fix in .NET SP1 C# compiler)316834 (fix in .NET SP1 C# compiler) Cannot debug with KD attachedCannot debug with KD attached

306037306037 Managed app fails to startManaged app fails to start

326098326098

Page 58: Windows Debugging Technique #3

ExceptionException 의 두가지 타입의 두가지 타입 First Chance ExceptionFirst Chance Exception

디버기에서 발생하는 이벤트를 디버거가 디버기에서 발생하는 이벤트를 디버거가 가로챘을 때의 가로챘을 때의 ExceptionException

디버거는 이 디버거는 이 ExceptionException 을 디버기가 처리할 을 디버기가 처리할 수 있도록 넘김수 있도록 넘김

Second chance ExceptionSecond chance Exception 디버거가 전달한 디버거가 전달한 ExceptionException 을 디버기가 을 디버기가

처리하지 못하면 디버거로 다시 처리하지 못하면 디버거로 다시 ExceptionException 이 이 날아옴날아옴

디버기가 디버기가 ExceptionException 을 처리하지 못했기 을 처리하지 못했기 때문에 오류 발생때문에 오류 발생 !!

Page 59: Windows Debugging Technique #3

© 2004 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.