서우석서우석
http://www.debuglab.comhttp://www.debuglab.com 운영자운영자
(seaousak@hotmail.com)(seaousak@hotmail.com)
Go to Debugging World #3Go to Debugging World #3
- Managed Debugging, WinDbg- Managed Debugging, WinDbg
AgendaAgenda
 Visual Studio .NET DebuggingVisual Studio .NET Debugging
 Symbol ServerSymbol Server 설정설정
 WinDBGWinDBG 사용하기사용하기
 Debugging War StoryDebugging War Story
 DebuggerDebugger 의 작동 원리의 작동 원리
 Debugging Tips & TricksDebugging Tips & Tricks
누구를 위한 웹 캐스트인가누구를 위한 웹 캐스트인가
?? VS .NETVS .NET 디버깅이 궁금한 개발자디버깅이 궁금한 개발자
 심볼 서버를 사용해보지 않은 개발자심볼 서버를 사용해보지 않은 개발자
 심볼 서버 설정에 어려움을 겪고 있는심볼 서버 설정에 어려움을 겪고 있는
개발자개발자
 심볼 서버로부터 도움을 받지 못하고 있심볼 서버로부터 도움을 받지 못하고 있
는 개발자는 개발자
 WinDBGWinDBG 를 실행해도 뭐가 뭔지 모르겠를 실행해도 뭐가 뭔지 모르겠
다는 개발자다는 개발자
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,
XMLXML 웹 서비스웹 서비스 ,, 네이티브 코드네이티브 코드 , SQL, SQL
디버깅을 하나의디버깅을 하나의 UIUI 에서 디버깅 가능에서 디버깅 가능 !!
중단점 사용 팁중단점 사용 팁
 고급 중단점을 사용하기 전에 한 단계씩고급 중단점을 사용하기 전에 한 단계씩
코드 실행 명령으로 디버깅을 시작하는코드 실행 명령으로 디버깅을 시작하는
것이 좋음것이 좋음
 중단점 창을 띄워 놓고 디버깅하는 것이중단점 창을 띄워 놓고 디버깅하는 것이
좋음좋음
 호출 스택에서 중단점 설정 가능호출 스택에서 중단점 설정 가능
 일회성 중단점일회성 중단점 : <: < 커서까지 실행커서까지 실행 >>
 하위 표현식에 중단점 설정 가능하위 표현식에 중단점 설정 가능
 for ( i = 0 , m = 0 ; i < 10 ; i++ , m-- )for ( i = 0 , m = 0 ; i < 10 ; i++ , m-- )
중단점 사용 팁중단점 사용 팁
 새 중단점 창에서 클래스와 메서드 직접새 중단점 창에서 클래스와 메서드 직접
입력입력
 MyThreadClass.ThreadFunc ( C# )MyThreadClass.ThreadFunc ( C# )
 오버로드된 메서드는 중단점 활성화 선택오버로드된 메서드는 중단점 활성화 선택
가능가능 !!
 찾기 콤보 상자에서 메서드를 입력한찾기 콤보 상자에서 메서드를 입력한
후후 , <F9>, <F9> 를 눌러 중단점 설정 가능를 눌러 중단점 설정 가능
 한 줄에 하나 이상의 중단점 설정 가능한 줄에 하나 이상의 중단점 설정 가능
Basic BPsBasic BPs
DemoDemo
조사식 창조사식 창
 변수의 값을 확인하는 것은 기본변수의 값을 확인하는 것은 기본 ! +! + 모모
든 표현식에 대한 결과를 확인할 수 있든 표현식에 대한 결과를 확인할 수 있
음음
 메서드 호출 가능메서드 호출 가능 !!
 여러 구조체의 데이터를 검증하기 위한 검여러 구조체의 데이터를 검증하기 위한 검
증 메서드를 만들어서 필요할 때마다 호출증 메서드를 만들어서 필요할 때마다 호출
가능가능
특성을 이용한 디버깅특성을 이용한 디버깅
 DebuggerStepThroughAttributeDebuggerStepThroughAttribute
 무조건 프로시저 단위 실행 명령 적용무조건 프로시저 단위 실행 명령 적용
 getget 이나이나 setset 액세서처럼 한 줄짜리 코드를액세서처럼 한 줄짜리 코드를
사용하는 경우에 유용사용하는 경우에 유용
 DebuggerHiddenAttributeDebuggerHiddenAttribute
 중단점 설정 불가능중단점 설정 불가능
 메서드를 완전히 숨길 수 있다메서드를 완전히 숨길 수 있다 ..
 Anti-DebuggingAnti-Debugging 기술은 아니다기술은 아니다 ..
 왜왜 ?? 이 특성은이 특성은 VS.NETVS.NET 디버거와디버거와 DBGCLR.EXEDBGCLR.EXE
에서 사용하지만에서 사용하지만 CORDBG.EXECORDBG.EXE 에서는 사용하지에서는 사용하지
않음않음
혼합 모드 디버깅혼합 모드 디버깅
 VS.NETVS.NET 디버거는디버거는 NativeNative 코드와코드와 ManagedManaged
코드를 동시에 디버깅할 수 있음코드를 동시에 디버깅할 수 있음
 일반적으로 각자 따로 디버깅하는 것이 좋음일반적으로 각자 따로 디버깅하는 것이 좋음
 장점장점
 하나의하나의 UIUI 에서 모든 작업을 진행에서 모든 작업을 진행
 단점단점
 매우 느릴 수 있다매우 느릴 수 있다 ..
 데이터 중단점 사용 불가데이터 중단점 사용 불가
 디버거가디버거가 NativeNative 코드 쪽에 위치하고 있지 않다코드 쪽에 위치하고 있지 않다
면면 ,, 해당 프로세스에 대한 미니 덤프 생성 불가해당 프로세스에 대한 미니 덤프 생성 불가
 팁팁
 옵션에서 ‘변수 창에서 속성 확인 허용’을옵션에서 ‘변수 창에서 속성 확인 허용’을
심볼심볼 (Symbol)(Symbol)
 .dll.dll 이나이나 .exe.exe 이 작성될 때 생성됨이 작성될 때 생성됨
 확장자가확장자가 .dbg.dbg 혹은혹은 .pdb.pdb
 함수 이름과 변수 이름과 같은 심볼 정함수 이름과 변수 이름과 같은 심볼 정
보 포함보 포함
 WindowsWindows 디버거와디버거와 Microsoft VisualMicrosoft Visual
Studio .NETStudio .NET 디버거와 같은 디버거가디버거와 같은 디버거가
호출 스택을 보여주기 위해서 사용호출 스택을 보여주기 위해서 사용
SymchkSymchk 툴툴
 Debugging Tools for WindowsDebugging Tools for Windows 에 포함에 포함
되어 있음되어 있음 ((http://www.microsoft.com/http://www.microsoft.com/
ddkddk/debugging//debugging/))
 명령줄에서 실행 가능명령줄에서 실행 가능 (( 경로 설정 필요경로 설정 필요 ))
 예예
 symchk /r c:windowssystem32 /ssymchk /r c:windowssystem32 /s
srv*c:ossymbols*http://msdl.microsoft.cosrv*c:ossymbols*http://msdl.microsoft.co
m/download/symbolsm/download/symbols
OSOS 심볼 서버심볼 서버
 VS 7.1VS 7.1 부터 지원부터 지원
 7.07.0 에서도 가능에서도 가능
 symsrv.dllsymsrv.dll 다운로드다운로드
 symsrv.dllsymsrv.dll 을을 devenv.exedevenv.exe 폴더에 복사폴더에 복사
 ““srv*” -> “symsrv*symsrv.dll*”srv*” -> “symsrv*symsrv.dll*”
 심볼 저장소로부터 자동으로심볼 저장소로부터 자동으로 PDBPDB 파일 검사파일 검사
 자동으로 바이너리 파일 검사자동으로 바이너리 파일 검사
 심볼 경로 문법은 다소 난해심볼 경로 문법은 다소 난해
 심볼 서버 설정 후심볼 서버 설정 후 ,, 심볼을 다운로드하기 때심볼을 다운로드하기 때
문에문에 ,, 프로그램 시작이 다소 지연됨프로그램 시작이 다소 지연됨
 symchksymchk /r/r c:windowssystem32 /sc:windowssystem32 /s
SRV*c:ossymbols*http://msdl.microsoft.com/dowSRV*c:ossymbols*http://msdl.microsoft.com/dow
nload/symbolsnload/symbols
OSOS 심볼 서버 경로 지정 방심볼 서버 경로 지정 방
법법 srv*[srv*[ 로컬캐시로컬캐시 *]*] 원격저장소위치원격저장소위치
 Project/Properties/Symbol PathProject/Properties/Symbol Path 에 입력에 입력
한다한다 ..
 minidumpminidump 사용시에는사용시에는 MODPATH=MODPATH= 인인
자로 넣는다자로 넣는다 ..
 로컬 캐시를 사용하면 다음번 디버깅시로컬 캐시를 사용하면 다음번 디버깅시
에 보다 빠르게 사용할 수 있다에 보다 빠르게 사용할 수 있다 ..
 원격 경로는 네트워크 주소 및 인터넷원격 경로는 네트워크 주소 및 인터넷
주소로 지정한다주소로 지정한다 ..
OSOS 심볼 서버 경로 지정 순심볼 서버 경로 지정 순
서서 서버로 사용할 컴퓨터 설정서버로 사용할 컴퓨터 설정
 예예 )) SYMBOLSSYMBOLS
 OSSYMBOLSOSSYMBOLS 이름으로 공유 폴더 생성이름으로 공유 폴더 생성
 Debugging Tools for WindowsDebugging Tools for Windows 설치 후설치 후 ,,
PATHPATH 환경 변수에 디렉터리 추가환경 변수에 디렉터리 추가
 프락시 서버 환경이라면프락시 서버 환경이라면
_NT_SYMBOL_PROXY_NT_SYMBOL_PROXY 환경 변수 설정환경 변수 설정
 _NT_SYMBOL_PATH_NT_SYMBOL_PATH 환경 변수 설정환경 변수 설정
제품 심볼 서버 설정제품 심볼 서버 설정
 서버로 사용할 컴퓨터 설정서버로 사용할 컴퓨터 설정
 예예 )) SYMBOLSSYMBOLS
 PRODUCTSYMBOLSPRODUCTSYMBOLS 이름으로 공유 폴이름으로 공유 폴
더 생성더 생성
 symstore add /r /f d:build*.* /ssymstore add /r /f d:build*.* /s
SYMBOLSproductsymbols /t “MyApp”SYMBOLSproductsymbols /t “MyApp”
/v “Build 632” /c “2004/09/14 Daily/v “Build 632” /c “2004/09/14 Daily
Build”Build”
 삭제 시에는 트랜잭션삭제 시에는 트랜잭션 IDID 사용사용
 symstore del /I 00000009 /ssymstore del /I 00000009 /s
symbolsproductsymbolssymbolsproductsymbols
SymbolSymbol 서버 설정서버 설정
NotepadNotepad 디버깅디버깅
OSSymbolTestOSSymbolTest
ProductSymbolTestProductSymbolTest
DemoDemo
참고자료참고자료
 HOW TO: Use a Symbol Server with theHOW 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/issues/0http://msdn.microsoft.com/msdnmag/issues/0
 WinDBGWinDBG
 SymbolsSymbols 섹션섹션
WinDBGWinDBG 사용사용
 WinDBGWinDBG 문서 필독문서 필독
 WinDBGWinDBG 기능기능
 WinDBGWinDBG 설정 및 사용설정 및 사용
 WinDBGWinDBG 는 심볼의 로드되는 경로설정을 위한 다양한 방는 심볼의 로드되는 경로설정을 위한 다양한 방
법제공법제공
 다중 프로세스 디버깅다중 프로세스 디버깅
 BreakPointBreakPoint 와와 exceptionexception 제어제어
 WinDBG commandsWinDBG commands
 덤프파일 디버깅덤프파일 디버깅
 VS.NET :VS.NET : 개발한 컴퓨터에서 생성된 덤프파일만 작동개발한 컴퓨터에서 생성된 덤프파일만 작동
 WinDBG :WinDBG : 고객으로부터 생성된 덤프파일도 가능고객으로부터 생성된 덤프파일도 가능
 SOSSOS
 ManagedManaged 와와 nativenative 가 혼합된가 혼합된 applicationapplication 의 유일한 디의 유일한 디
버깅 방법버깅 방법
WinDBGWinDBG 가 무엇인가가 무엇인가 ??
 탄생배경탄생배경 : OS: OS 의의 debuggingdebugging 자동화를 위함자동화를 위함
 VS.NETVS.NET 디버거디버거 , WinDBG, WinDBG
 VS.NETVS.NET 디버거는 응용 어플리케이션 개발자디버거는 응용 어플리케이션 개발자
 WinDBGWinDBG 는 운영체계를 다루는 개발자를 위함는 운영체계를 다루는 개발자를 위함
 Device driverDevice driver 및및 user mode native appuser mode native app 에도 막강한 기에도 막강한 기
능 사용가능능 사용가능
 다양한다양한 processprocess 정보정보 ->-> 어렵게 만드는 요인어렵게 만드는 요인 ??
 Memory breakpointMemory breakpoint
 Mini-dumpMini-dump 를 다룰 수 있도록 향상된 바이너리 제공를 다룰 수 있도록 향상된 바이너리 제공
 완전한 운영체제의완전한 운영체제의 heap, processheap, process 의의 handlehandle 정보를 볼정보를 볼
수 있음수 있음
 Install dirInstall dir 의의 dubugger.chmdubugger.chm 의 도움말 파일의 도움말 파일
 UIUI 는 단순히는 단순히 DBGENG.DLLDBGENG.DLL 을 감싸는 정도이며을 감싸는 정도이며
NTSD(ms symbolic debugger)NTSD(ms symbolic debugger) 와 비슷하므로와 비슷하므로 winDBGwinDBG 를를
익히면익히면 NTSDNTSD 도 쉽게 익힐 수 있음도 쉽게 익힐 수 있음
WinDBGWinDBG 설치설치
 Download pageDownload page
 http://www.microsoft.com/whdc/devtools/debhttp://www.microsoft.com/whdc/devtools/deb
 Overview pageOverview page
 http://www.microsoft.com/http://www.microsoft.com/
whdc/devtools/debugging/default.mspxwhdc/devtools/debugging/default.mspx
WinDBGWinDBG 설정설정
 VS.NET symbol serverVS.NET symbol server
 VS.NET symbolVS.NET symbol 서버 설정서버 설정 -> WinDBG-> WinDBG 는 자동으는 자동으
로로 _NT_SYMBOL_PATH_NT_SYMBOL_PATH 환경변수를 기본 심볼경환경변수를 기본 심볼경
로로 사용로로 사용
 공통 소스파일을 찾기 위한 작업 필요공통 소스파일을 찾기 위한 작업 필요
 _NT_SOURCE_PATH_NT_SOURCE_PATH 환경변수 등록환경변수 등록
 WinDBGWinDBG 를 열고를 열고 source search pathsource search path 에 필요정보 입력에 필요정보 입력
 WinDBGWinDBG 가 바이너리 파일을 찾기 위한 실행파일가 바이너리 파일을 찾기 위한 실행파일
이미지 경로 설정이미지 경로 설정
 File-Image File PathFile-Image File Path 를 이용해 설정를 이용해 설정 :: 개발자개발자 ,, 고객의고객의
dumpdump
 CommandCommand 창에 기본 워크스페이스에 색상정창에 기본 워크스페이스에 색상정
보 입력보 입력
 엄청난 정보중에엄청난 정보중에 TRACE, OutputDebugStringTRACE, OutputDebugString 등등
의 정보만을 선택하기 위한 작업의 정보만을 선택하기 위한 작업 -> Debuggee-> Debuggee
WinDBG commandsWinDBG commands
 WinDBG commandsWinDBG commands 종류종류 // 특징특징
 일반명령일반명령
 디버기 제어디버기 제어 :: 추정추정 ,, 단계실행단계실행 ,, 메모리 확인등메모리 확인등
등등
 메타명령메타명령 (.(. 명령명령 ))
 디버거와 디버깅 방법 제어디버거와 디버깅 방법 제어 :: 로그파일생성로그파일생성 ,,
프로세스 연결프로세스 연결 ,, 덤프파일 작성 등등덤프파일 작성 등등
 확장명령확장명령
 디버기를 제어하고 현재 상태분석디버기를 제어하고 현재 상태분석 :: 덤프처리덤프처리 ,,
임계세션 분석임계세션 분석 ,, 충돌분석 등등충돌분석 등등
 일반일반 ,, 메타 명령은 대소문자 구별메타 명령은 대소문자 구별 X,X, 확장확장
명령 구분명령 구분
심볼 로드심볼 로드
 WinDGBWinDGB 심볼처리 우수함심볼처리 우수함
 VS.NETVS.NET 보다 심볼처리 뛰어나며보다 심볼처리 뛰어나며 VS.NETVS.NET
은 로드된 심볼을 확인할 수 없으므로 필자은 로드된 심볼을 확인할 수 없으므로 필자
는는 VS.NETVS.NET 을 사용하기 전에을 사용하기 전에 WinDBGWinDBG 를를
이용한다고함이용한다고함 (winDBG(winDBG 의의 lmlm 으로 확인으로 확인
가능가능 ))
 Lm v m : v-Lm v m : v- 자세한 정보자세한 정보 , m-module, m-module
 AnytimeAnytime
 Lazy symbol loading(save memory)Lazy symbol loading(save memory)
 Ex) kernel debuggingEx) kernel debugging 시시 NTDLL.DLLNTDLL.DLL 만 로딩만 로딩
 LD(load symbol) :LD(load symbol) : 강제 로딩강제 로딩
 실행파일을실행파일을 loadload 할 경우할 경우 buildbuild 를를 /checksum/checksum
으로 하여야 함으로 하여야 함
Process & ThreadProcess & Thread
 Multi-process debuggingMulti-process debugging
 VS.NET, WinDBGVS.NET, WinDBG 모두 가능모두 가능
 WinDBGWinDBG 가가 process controlprocess control 이 더 우수함이 더 우수함
 CommandsCommands
 .childdbg option.childdbg option 변경변경
 | : process status| : process status
 . :. : 활성화된활성화된 processprocess
 # : WinDBG# : WinDBG 에서 실행을 중단하기위해 예외를 발생시킨에서 실행을 중단하기위해 예외를 발생시킨
processprocess
 ~ : thread status~ : thread status
 .create c:winntsystem32sol.exe.create c:winntsystem32sol.exe
 .attach : tlist->.attach : tlist-> 실행 중실행 중 process attachprocess attach
 Child process debugging exampleChild process debugging example
실행실행 ,, 단계 실행단계 실행 ,, 추적추적
 WinDBGWinDBG 의의 G(go), T(trace), P(step)G(go), T(trace), P(step)
 F5F5 로 실행은 하거나로 실행은 하거나 shift + F11shift + F11 등의 단축키는등의 단축키는 g,g,
tt 등의 명령을 수행하는 것 뿐임등의 명령을 수행하는 것 뿐임
 데이터 추적데이터 추적 ,, 조사조사 (p443)(p443)
 DV :DV : 변수의 값변수의 값 , DT :, DT : 변수변수 typetype
 성능과 관련된 문제를 해결할 경우 예를 들어성능과 관련된 문제를 해결할 경우 예를 들어
STLSTL 같은 경우같은 경우 debugdebug 가 어려움가 어려움 -> wt(trace and-> wt(trace and
watch data)watch data) 명령어에 시간을 투자해 연구해야 함명령어에 시간을 투자해 연구해야 함 ,,
즉즉 wtwt 명령을 실행하면서명령을 실행하면서 kernel modekernel mode 변환이 얼변환이 얼
마나 발생하는지 여부마나 발생하는지 여부 (( 성능의 핵심성능의 핵심 )) 를 측정하여를 측정하여
kmkm 변환을 피하는 방법을 강구변환을 피하는 방법을 강구 ->-> 성능 향상성능 향상
 로그를 이용한로그를 이용한 dump : .logopen(filename) ,dump : .logopen(filename) ,
.logappend, .logclose.logappend, .logclose 등의등의 metameta 명령을 이용명령을 이용
실행실행 ,, 단계 실행단계 실행 ,, 추적추적
 BreakpointBreakpoint
 일반적인일반적인 breakpointbreakpoint
 BP : memory addressBP : memory address 를 이용함를 이용함
 BU :BU : 심볼을 이용함심볼을 이용함
 BL : breakpoint listBL : breakpoint list
 BE, BD : breakpoint enable/disableBE, BD : breakpoint enable/disable
 JJ 표현식표현식 ?? 참 명령참 명령 ;; 거짓 명령거짓 명령
 Memory accessMemory access
 BA : BPBA : BP 인인 memory addressmemory address 를 이용해를 이용해 debuggingdebugging 을 하을 하
고고 DVDV 를 이용해 변수 주소를 확인해서 사용가능를 이용해 변수 주소를 확인해서 사용가능
 예외와 이벤트예외와 이벤트
 Access violationAccess violation 도 포함됨도 포함됨
 CommandCommand 도 지원하지만도 지원하지만 debug-event filtersdebug-event filters
menumenu 이용 권장이용 권장
 P451P451 예외 브레이크 상태 참조예외 브레이크 상태 참조
WinDBGWinDBG 제어하기제어하기
 추가적인 메타 명령들추가적인 메타 명령들
 .cls : clear screen.cls : clear screen
 .enable_unicode : unicode.enable_unicode : unicode
 .locale.locale
 .formats.formats
 .shell.shell
 .occommand : outputdebugstring.occommand : outputdebugstring 함수 호함수 호
출시 접두사 명시출시 접두사 명시
확장 기능확장 기능
 확장기능 로드확장기능 로드 ,, 제어제어
 .chain.chain 으로 로드된 확장기능 검토으로 로드된 확장기능 검토
 SOSSOS 를를 loadload 하면 이 부분에하면 이 부분에 SOS.dllSOS.dll 이 추가됨을 알 수이 추가됨을 알 수
있음있음
 .load sos : .dll.load sos : .dll 은 생략해야 함은 생략해야 함
 .load, .unload.load, .unload 로 확장로 확장 dll load & unloaddll load & unload
 중요한 확장 명령들중요한 확장 명령들
 !analyze –v :!analyze –v : 현재 예외에 대한 간단한 분석정보현재 예외에 대한 간단한 분석정보
 !critsec!critsec 주소주소 :: 임계섹션임계섹션
 !locks –v :!locks –v : 잠겨진 임계섹션 확인잠겨진 임계섹션 확인
 !token : thread!token : thread 에 적용된 보안 정보에 적용된 보안 정보
 !handle :!handle : 핸들을 포함하는 객체타입 및 요약정보핸들을 포함하는 객체타입 및 요약정보
 메모리메모리 leak, deadlock debugleak, deadlock debug 중요한중요한 debuggingdebugging
덤프파일 생성하기덤프파일 생성하기
 디버깅 도중디버깅 도중 .DUMP.DUMP 명령으로 파일 생성명령으로 파일 생성
 Ex) .dump /a/u c:tempaa.dmpEx) .dump /a/u c:tempaa.dmp 로 하면 실제 파일로 하면 실제 파일
은은 aa_2004-10-15_18-30-13-108_05E8.dmpaa_2004-10-15_18-30-13-108_05E8.dmp 로 생로 생
성성
 덤프파일덤프파일 optionoption
 /u :/u : 날짜날짜 ,, 시간시간 , PID, PID 를 파일이름으로 추가함를 파일이름으로 추가함
 /c :/c : 자세한 정보자세한 정보
 /a : load/a : load 된 모든 프로세스에 대한 정보된 모든 프로세스에 대한 정보
 /f :/f : 현재현재 thread stackthread stack 부터부터 loadload 된 실제된 실제 binarybinary
에 대한 메모리 데이터까지 모든 정보 포함에 대한 메모리 데이터까지 모든 정보 포함
 /m :/m : 일반적인일반적인 mini dump (vs.netmini dump (vs.net 과 동일과 동일 ))
 /b : dmp/b : dmp 파일을 압축하여파일을 압축하여 .cab.cab 파일 생성파일 생성
덤프파일 열기덤프파일 열기
 방법방법
 WinDBGWinDBG 의 메뉴의 메뉴 (open crash dump)(open crash dump)
 덤프파일을 열고 심볼덤프파일을 열고 심볼 ,, 소스소스 ,, 바이너리 경바이너리 경
로 설정로 설정
 단계단계
 LM /vLM /v 를 이용해 로드된 심볼 확인를 이용해 로드된 심볼 확인 :: 필요필요
시 심볼 경로설정시 심볼 경로설정
 이미지 경로 설정이미지 경로 설정
 Windows hotfixWindows hotfix 의 경우의 경우 OSSYMS.JSOSSYMS.JS 를 실행하를 실행하
여 심볼 저장소 다시 로드해아함여 심볼 저장소 다시 로드해아함 ..
 덤프 디버깅은덤프 디버깅은 WinDBGWinDBG 사용법과 동일사용법과 동일
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>sdkv1.1Tool: <.net install dir>sdkv1.1Tool
developers guidesamplessosdevelopers guidesamplessos
 상세한 내용은상세한 내용은 sos.htmsos.htm 참조참조
SOS.dll loadSOS.dll load
 SOSSOS 는는 .NET Framework.NET Framework 의 일부의 일부
 Vsvars32.batVsvars32.bat 실행실행
 .net.net 과 관련된과 관련된 dirdir 경로에 포함되도록 환경설정경로에 포함되도록 환경설정
 .load sos.load sos 실행실행
 ExampleExample
 책의책의 sourcesource 의의 exceptapp.exeexceptapp.exe
 !thread!thread 를 이용해를 이용해 appDomainappDomain 의 정보를 알수있음의 정보를 알수있음
 !clrstack .all!clrstack .all 을 이용해을 이용해 stackstack 확인확인
 !dumpstack : .net!dumpstack : .net 과과 nativenative 호출이 많은 프로그호출이 많은 프로그
램을 다루는램을 다루는 appapp 의 호출 스택확인의 호출 스택확인
 !dumpclass : class!dumpclass : class 의 모든의 모든 data fielddata field 확인확인
 ~~~~
디버깅 전쟁 이야기디버깅 전쟁 이야기
 동료와 공유하기 위한 디버깅 과정 기술동료와 공유하기 위한 디버깅 과정 기술
방법방법
 사례 실습으로 적극 활용사례 실습으로 적극 활용
 훌륭한 디버깅 팁으로 자료 공유훌륭한 디버깅 팁으로 자료 공유
 John RobbinsJohn Robbins 가 처음 도입가 처음 도입
디버깅 전쟁 이야기디버깅 전쟁 이야기 #1#1
 사건 발단사건 발단
 파일 생성이 되지 않는다파일 생성이 되지 않는다 !!
 전개전개
 fopenfopen 에서 오류가 발생하여 조사식 창에서에서 오류가 발생하여 조사식 창에서
@err,hr@err,hr 을 입력하여을 입력하여 Last ErrorLast Error 값 확인값 확인
 ““ 파일의 경로를 찾을 수 없습니다파일의 경로를 찾을 수 없습니다 .”.”
 분명히 파일의 경로에 문제가 있음분명히 파일의 경로에 문제가 있음 !!
 파일을 여는 두 가지 방법파일을 여는 두 가지 방법
 MFCMFC 의의 SDI/MDISDI/MDI 에서 지원하는에서 지원하는 [[ 최근에 사용한 파최근에 사용한 파
일일 ]] 메뉴 이용메뉴 이용
 오류 발생하지 않음오류 발생하지 않음 !!
 [[ 파일파일 ]-[]-[ 열기열기 ]] 메뉴 이용메뉴 이용
 오류 발생오류 발생 !!
디버깅 전쟁 이야기디버깅 전쟁 이야기 #1#1
 전개전개
 상대 경로의 주소는 다음과 같이 선언되어 있상대 경로의 주소는 다음과 같이 선언되어 있
음음
 #define FILE_SAVE_PATH “Data/result.dat”#define FILE_SAVE_PATH “Data/result.dat”
 상대 경로를 절대 경로로 바꾸니 성공상대 경로를 절대 경로로 바꾸니 성공 !!
 분석분석
 [[ 최근에 사용한 파일최근에 사용한 파일 ]] 메뉴는 절대 경로를 이메뉴는 절대 경로를 이
용하는 방법용하는 방법
 [[ 파일파일 ]-[]-[ 열기열기 ]] 사용시에는 프로그램의 실행사용시에는 프로그램의 실행
경로가 파일을 열었던 경로로 바뀌어 버림경로가 파일을 열었던 경로로 바뀌어 버림
 해결해결
 프로그램 시작 시 실행 경로를 저장하여프로그램 시작 시 실행 경로를 저장하여 ,, 상상
대 경로가 필요할 때마다 저장된 경로를 이용대 경로가 필요할 때마다 저장된 경로를 이용
디버깅 전쟁 이야기디버깅 전쟁 이야기 #1#1
 교훈교훈
 상대 경로를 이용하는 프로그램은 어떤 외부상대 경로를 이용하는 프로그램은 어떤 외부
적인 요인에 의해서 현재 경로가 바뀔 수 있적인 요인에 의해서 현재 경로가 바뀔 수 있
음을 주의해야 함음을 주의해야 함
 디버깅을 하기 전에 여러 가지 테스트 케이스디버깅을 하기 전에 여러 가지 테스트 케이스
를 미리 정해놓고 디버깅을 시작하는 것이 도를 미리 정해놓고 디버깅을 시작하는 것이 도
움이 됨움이 됨
디버깅 전쟁 이야기디버깅 전쟁 이야기 #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;
}}
 pHeadpHead 값이값이 NULLNULL 로 설정로 설정
 값을 확인하기 위하여 데이터 중단점 설정값을 확인하기 위하여 데이터 중단점 설정
디버깅 전쟁 이야기디버깅 전쟁 이야기 #2#2
 전개전개 (( 계속계속 ))
디버깅 전쟁 이야기디버깅 전쟁 이야기 #2#2
 전개전개 (( 계속계속 ))
 데이터 중단점을 통해서 변수의 값들을 확데이터 중단점을 통해서 변수의 값들을 확
인인
 교훈교훈
 포인터 개념을 정확하게 이해하도록 하자포인터 개념을 정확하게 이해하도록 하자 ..
 디버거의 기능을 충분히 활용하도록 하자디버거의 기능을 충분히 활용하도록 하자 ..
디버거 작동 원리디버거 작동 원리
 Win32Win32 디버거는디버거는 WindowsWindows 의 기능을의 기능을
사용한다사용한다 ..
 요구 사항요구 사항
 CreateProcessCreateProcess 의의 dwCreationFlagsdwCreationFlags 매개매개
변수에변수에 DEBUG_ONLY_THIS_PROCESSDEBUG_ONLY_THIS_PROCESS
설정설정
 디버기를 시작하고 나서디버기를 시작하고 나서
WaitForDebugEvent APIWaitForDebugEvent API 함수를 호출하여함수를 호출하여
루프로 진입루프로 진입
 이벤트를 처리하고 난 후에는이벤트를 처리하고 난 후에는
ContinueDebugEventContinueDebugEvent 함수 호출함수 호출

디버거의 기본 골격 코드디버거의 기본 골격 코드
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 ( … );
}}
}}
디버깅 이벤트디버깅 이벤트
 DEBUG_EVENTDEBUG_EVENT 구조체구조체 (( 내부적으로내부적으로
unionunion 구조구조 )) 에 모든 데이터가 들어옴에 모든 데이터가 들어옴
 CREATE_PROCESS_DEBUG_EVENTCREATE_PROCESS_DEBUG_EVENT
 새로운 프로세스가 디버깅되는 프로세스새로운 프로세스가 디버깅되는 프로세스
내에서 생성될 때나 디버거가 이미 활성화내에서 생성될 때나 디버거가 이미 활성화
되어 있는 프로세스를 디버깅할 때마다 발되어 있는 프로세스를 디버깅할 때마다 발
생생
 CREATE_THREAD_DEBUG_EVENTCREATE_THREAD_DEBUG_EVENT
 새로운 스레드가 시작할 때 발생새로운 스레드가 시작할 때 발생
 EXCEPTION_DEBUG_EVENTEXCEPTION_DEBUG_EVENT
 디버기에서 예외가 발생할 때 발생디버기에서 예외가 발생할 때 발생
디버깅 이벤트디버깅 이벤트
 EXIT_PROCESS_DEBUG_EVENTEXIT_PROCESS_DEBUG_EVENT
 마지막 스레드가 디버거를 나갈 때나마지막 스레드가 디버거를 나갈 때나
ExitProcessExitProcess 함수를 호출할 때함수를 호출할 때
 EXIT_THREAD_DEBUG_EVENTEXIT_THREAD_DEBUG_EVENT
 디버기의 스레드가 종료할 때 발생디버기의 스레드가 종료할 때 발생
 디버거가 이 핸들을 닫아서는 안됨디버거가 이 핸들을 닫아서는 안됨
 LOAD_DLL_DEBUG_EVENTLOAD_DLL_DEBUG_EVENT
 디버기가디버기가 DLLDLL 을 로드할 때 발생을 로드할 때 발생
 OUTPUT_DEBUG_STRING_EVENTOUTPUT_DEBUG_STRING_EVENT
 디버기가디버기가 OutputDebugStringOutputDebugString 함수 호출할 때 발함수 호출할 때 발
생생
 UNLOAD_DLL_DEBUG_EVENTUNLOAD_DLL_DEBUG_EVENT
 디버기가디버기가 FreeLibraryFreeLibrary 로로 DLLDLL 을 언로드할 때 발을 언로드할 때 발
디버거 작성 시 주의 사항디버거 작성 시 주의 사항
 WriteProcessMemoryWriteProcessMemory 함수를 호출하여함수를 호출하여
디버기의 코드를 고치는 경우디버기의 코드를 고치는 경우 ,,
FlushInstructionCacheFlushInstructionCache 함수를 호출하함수를 호출하
여 업데이트 해주어야 함여 업데이트 해주어야 함
 중단점이 활성화되면중단점이 활성화되면
ContinueDebugEventContinueDebugEvent 함수를 호출해야함수를 호출해야
한다한다 ..
MINDBGMINDBG
DemoDemo
Tips & TricksTips & Tricks
메모리 값의 의미메모리 값의 의미
 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 로 해제된 값로 해제된 값 .. 사용하려는 값이 해제되었는지 확사용하려는 값이 해제되었는지 확
인하기 위해서 사용가능인하기 위해서 사용가능
 0xFD0xFD
 DEBUG_NEWDEBUG_NEW 가 정의되어 있을 때가 정의되어 있을 때 ,, 메모리 영역을 보호하기 위하메모리 영역을 보호하기 위하
여 메모리 공간 앞뒤에 추가함여 메모리 공간 앞뒤에 추가함
디버거 자동 실행디버거 자동 실행
 응용 프로그램이 시작하면서 디버거가응용 프로그램이 시작하면서 디버거가
자동을 실행자동을 실행
 WindowsWindows 서비스와서비스와 COMCOM 아웃아웃 -- 오브오브 -- 프프
로세스에서 유용로세스에서 유용
 HKEY_LOCAL_MACHINESOFTWAREMHKEY_LOCAL_MACHINESOFTWAREM
icrosoftWindowsNTCurrentVersionImicrosoftWindowsNTCurrentVersionIm
age File Execution Optionsage File Execution Options 키에서 응용키에서 응용
프로그램의 파일 이름과 동일 이름의 키프로그램의 파일 이름과 동일 이름의 키
를 생성를 생성
 DebuggerDebugger 문자열 값문자열 값 :: 실행하고자 하는실행하고자 하는
디버거의 전체 경로와 파일 이름 입력디버거의 전체 경로와 파일 이름 입력
배열의 특정 범위만 확인배열의 특정 범위만 확인
 크기가크기가 50005000 인 배열에서인 배열에서 , 2000, 2000 번째 부번째 부
터터 1010 개 요소만 확인하고 싶을때개 요소만 확인하고 싶을때
 Char pFoo[5000];Char pFoo[5000];
 WatchWatch 창에서창에서 (pFoo + 2000) , 10(pFoo + 2000) , 10
DirectXDirectX 데이터 표시데이터 표시
 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>_D3DDISPLAYMODE =w=<Width> h=<Height>
Hz=<RefreshRate> Fmt=<Format>Hz=<RefreshRate> Fmt=<Format>
_D3DVIEWPORT8 =x=<x> y=<y> width=<Width>_D3DVIEWPORT8 =x=<x> y=<y> width=<Width>
height=<Height>height=<Height>
(Visual C++ 6.0(Visual C++ 6.0 에서도 가능에서도 가능 ))
스레드 이름 설정스레드 이름 설정
typedef struct tagTHREADNAME_INFOtypedef struct tagTHREADNAME_INFO
{{
DWORDDWORD dwType;dwType; // must be 0x1000// must be 0x1000
LPCSTRLPCSTR 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)
{{
}}
콘솔콘솔 TRACETRACE
 제품 디버깅 시에도 활용 가능제품 디버깅 시에도 활용 가능
 AllocConsoleAllocConsole 와와 FreeConsole APIFreeConsole API 활용활용
 프로그램의 상태를 확인하기 위하여 실프로그램의 상태를 확인하기 위하여 실
행 옵션 이용행 옵션 이용
SP2SP2 에서의 원격 디버깅에서의 원격 디버깅
 DCOMDCOM 설정설정 (Visual Studio Computer)(Visual Studio Computer)
 DCOMCNFGDCOMCNFG 실행실행
 Component ServicesComponent Services  컴퓨터컴퓨터  내 컴퓨터 클릭후에 내 컴퓨내 컴퓨터 클릭후에 내 컴퓨
터 구성 버튼 클릭터 구성 버튼 클릭
 기본기본 COMCOM 보안 탭에서 액세스 권한에보안 탭에서 액세스 권한에 ANONYMOUS LOGONANONYMOUS LOGON
추가 후추가 후 ,, 원격 접속 권한 허용원격 접속 권한 허용
 WindowsWindows 방화벽 설정방화벽 설정 (VS(VS 와 원격 모두와 원격 모두 ))
 DebuggerFirewallConfiguration.exeDebuggerFirewallConfiguration.exe 파일 다운로드파일 다운로드
 ASP, ASP.NET, ATLASP, ASP.NET, ATL 서버 디버깅서버 디버깅
 Enable Web Server Debugging :Enable Web Server Debugging : KB 833977KB 833977
 스크립트 디버깅스크립트 디버깅
 Enable Script Debugging :Enable Script Debugging : KB 833977KB 833977
 원격원격 T-SQLT-SQL 디버깅디버깅
 현재로서는 불가능현재로서는 불가능 , SP, SP 제공 후 지원 가능제공 후 지원 가능
 관리자 권한을 갖고 있지 않은 개발자관리자 권한을 갖고 있지 않은 개발자
 Run the debugger as a normal user :Run the debugger as a normal user : KB 833977KB 833977
프로세스 다루기프로세스 다루기
 Process KillProcess Kill
 작업 관리자작업 관리자 , Process Explorer,, Process Explorer,
Taskkill(Windows XP+)Taskkill(Windows XP+)
 우선 순위 다루기우선 순위 다루기
 ntsd taskmgrntsd taskmgr 로로 SeDebugPrivilegeSeDebugPrivilege 획득획득
 ntsd –hd –c “qd” taskmgrntsd –hd –c “qd” taskmgr
 -hd :-hd : 일반 힙 사용일반 힙 사용
 -c :-c : 첫번째 명령 실행첫번째 명령 실행
실행 순서 확인실행 순서 확인
 ManagedManaged 응용 프로그램의 실행 순서 확인응용 프로그램의 실행 순서 확인
 프로그램의 전체적인 흐름을 살펴볼 수 있다프로그램의 전체적인 흐름을 살펴볼 수 있다 ..
 프로파일링프로파일링 (Profiling)(Profiling) 과 같은 기능과 같은 기능
 CORDBG.EXECORDBG.EXE 의의 wtwt 명령명령
(cordbg) wt(cordbg) wt
1 App::Main1 App::Main
3 App::Foo3 App::Foo
3 App::Bar3 App::Bar
5 App::Baz5 App::Baz
3 App::Bar3 App::Bar
3 App::Foo3 App::Foo
3 App::Main3 App::Main
21 instructions total21 instructions total
디버그디버그 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
ExceptionException 의 두가지 타입의 두가지 타입
 First Chance ExceptionFirst Chance Exception
 디버기에서 발생하는 이벤트를 디버거가디버기에서 발생하는 이벤트를 디버거가
가로챘을 때의가로챘을 때의 ExceptionException
 디버거는 이디버거는 이 ExceptionException 을 디버기가 처리을 디버기가 처리
할 수 있도록 넘김할 수 있도록 넘김
 Second chance ExceptionSecond chance Exception
 디버거가 전달한디버거가 전달한 ExceptionException 을 디버기가을 디버기가
처리하지 못하면 디버거로 다시처리하지 못하면 디버거로 다시 ExceptionException
이 날아옴이 날아옴
 디버기가디버기가 ExceptionException 을 처리하지 못했기을 처리하지 못했기
때문에 오류 발생때문에 오류 발생 !!
© 2004 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

Windows Debugging Technique #3

  • 1.
    서우석서우석 http://www.debuglab.comhttp://www.debuglab.com 운영자운영자 (seaousak@hotmail.com)(seaousak@hotmail.com) Go toDebugging World #3Go to Debugging World #3 - Managed Debugging, WinDbg- Managed Debugging, WinDbg
  • 2.
    AgendaAgenda  Visual Studio.NET DebuggingVisual Studio .NET Debugging  Symbol ServerSymbol Server 설정설정  WinDBGWinDBG 사용하기사용하기  Debugging War StoryDebugging War Story  DebuggerDebugger 의 작동 원리의 작동 원리  Debugging Tips & TricksDebugging Tips & Tricks
  • 3.
    누구를 위한 웹캐스트인가누구를 위한 웹 캐스트인가 ?? VS .NETVS .NET 디버깅이 궁금한 개발자디버깅이 궁금한 개발자  심볼 서버를 사용해보지 않은 개발자심볼 서버를 사용해보지 않은 개발자  심볼 서버 설정에 어려움을 겪고 있는심볼 서버 설정에 어려움을 겪고 있는 개발자개발자  심볼 서버로부터 도움을 받지 못하고 있심볼 서버로부터 도움을 받지 못하고 있 는 개발자는 개발자  WinDBGWinDBG 를 실행해도 뭐가 뭔지 모르겠를 실행해도 뭐가 뭔지 모르겠 다는 개발자다는 개발자
  • 4.
    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, XMLXML 웹 서비스웹 서비스 ,, 네이티브 코드네이티브 코드 , SQL, SQL 디버깅을 하나의디버깅을 하나의 UIUI 에서 디버깅 가능에서 디버깅 가능 !!
  • 5.
    중단점 사용 팁중단점사용 팁  고급 중단점을 사용하기 전에 한 단계씩고급 중단점을 사용하기 전에 한 단계씩 코드 실행 명령으로 디버깅을 시작하는코드 실행 명령으로 디버깅을 시작하는 것이 좋음것이 좋음  중단점 창을 띄워 놓고 디버깅하는 것이중단점 창을 띄워 놓고 디버깅하는 것이 좋음좋음  호출 스택에서 중단점 설정 가능호출 스택에서 중단점 설정 가능  일회성 중단점일회성 중단점 : <: < 커서까지 실행커서까지 실행 >>  하위 표현식에 중단점 설정 가능하위 표현식에 중단점 설정 가능  for ( i = 0 , m = 0 ; i < 10 ; i++ , m-- )for ( i = 0 , m = 0 ; i < 10 ; i++ , m-- )
  • 6.
    중단점 사용 팁중단점사용 팁  새 중단점 창에서 클래스와 메서드 직접새 중단점 창에서 클래스와 메서드 직접 입력입력  MyThreadClass.ThreadFunc ( C# )MyThreadClass.ThreadFunc ( C# )  오버로드된 메서드는 중단점 활성화 선택오버로드된 메서드는 중단점 활성화 선택 가능가능 !!  찾기 콤보 상자에서 메서드를 입력한찾기 콤보 상자에서 메서드를 입력한 후후 , <F9>, <F9> 를 눌러 중단점 설정 가능를 눌러 중단점 설정 가능  한 줄에 하나 이상의 중단점 설정 가능한 줄에 하나 이상의 중단점 설정 가능
  • 7.
  • 8.
    조사식 창조사식 창 변수의 값을 확인하는 것은 기본변수의 값을 확인하는 것은 기본 ! +! + 모모 든 표현식에 대한 결과를 확인할 수 있든 표현식에 대한 결과를 확인할 수 있 음음  메서드 호출 가능메서드 호출 가능 !!  여러 구조체의 데이터를 검증하기 위한 검여러 구조체의 데이터를 검증하기 위한 검 증 메서드를 만들어서 필요할 때마다 호출증 메서드를 만들어서 필요할 때마다 호출 가능가능
  • 9.
    특성을 이용한 디버깅특성을이용한 디버깅  DebuggerStepThroughAttributeDebuggerStepThroughAttribute  무조건 프로시저 단위 실행 명령 적용무조건 프로시저 단위 실행 명령 적용  getget 이나이나 setset 액세서처럼 한 줄짜리 코드를액세서처럼 한 줄짜리 코드를 사용하는 경우에 유용사용하는 경우에 유용  DebuggerHiddenAttributeDebuggerHiddenAttribute  중단점 설정 불가능중단점 설정 불가능  메서드를 완전히 숨길 수 있다메서드를 완전히 숨길 수 있다 ..  Anti-DebuggingAnti-Debugging 기술은 아니다기술은 아니다 ..  왜왜 ?? 이 특성은이 특성은 VS.NETVS.NET 디버거와디버거와 DBGCLR.EXEDBGCLR.EXE 에서 사용하지만에서 사용하지만 CORDBG.EXECORDBG.EXE 에서는 사용하지에서는 사용하지 않음않음
  • 10.
    혼합 모드 디버깅혼합모드 디버깅  VS.NETVS.NET 디버거는디버거는 NativeNative 코드와코드와 ManagedManaged 코드를 동시에 디버깅할 수 있음코드를 동시에 디버깅할 수 있음  일반적으로 각자 따로 디버깅하는 것이 좋음일반적으로 각자 따로 디버깅하는 것이 좋음  장점장점  하나의하나의 UIUI 에서 모든 작업을 진행에서 모든 작업을 진행  단점단점  매우 느릴 수 있다매우 느릴 수 있다 ..  데이터 중단점 사용 불가데이터 중단점 사용 불가  디버거가디버거가 NativeNative 코드 쪽에 위치하고 있지 않다코드 쪽에 위치하고 있지 않다 면면 ,, 해당 프로세스에 대한 미니 덤프 생성 불가해당 프로세스에 대한 미니 덤프 생성 불가  팁팁  옵션에서 ‘변수 창에서 속성 확인 허용’을옵션에서 ‘변수 창에서 속성 확인 허용’을
  • 11.
    심볼심볼 (Symbol)(Symbol)  .dll.dll이나이나 .exe.exe 이 작성될 때 생성됨이 작성될 때 생성됨  확장자가확장자가 .dbg.dbg 혹은혹은 .pdb.pdb  함수 이름과 변수 이름과 같은 심볼 정함수 이름과 변수 이름과 같은 심볼 정 보 포함보 포함  WindowsWindows 디버거와디버거와 Microsoft VisualMicrosoft Visual Studio .NETStudio .NET 디버거와 같은 디버거가디버거와 같은 디버거가 호출 스택을 보여주기 위해서 사용호출 스택을 보여주기 위해서 사용
  • 12.
    SymchkSymchk 툴툴  DebuggingTools for WindowsDebugging Tools for Windows 에 포함에 포함 되어 있음되어 있음 ((http://www.microsoft.com/http://www.microsoft.com/ ddkddk/debugging//debugging/))  명령줄에서 실행 가능명령줄에서 실행 가능 (( 경로 설정 필요경로 설정 필요 ))  예예  symchk /r c:windowssystem32 /ssymchk /r c:windowssystem32 /s srv*c:ossymbols*http://msdl.microsoft.cosrv*c:ossymbols*http://msdl.microsoft.co m/download/symbolsm/download/symbols
  • 13.
    OSOS 심볼 서버심볼서버  VS 7.1VS 7.1 부터 지원부터 지원  7.07.0 에서도 가능에서도 가능  symsrv.dllsymsrv.dll 다운로드다운로드  symsrv.dllsymsrv.dll 을을 devenv.exedevenv.exe 폴더에 복사폴더에 복사  ““srv*” -> “symsrv*symsrv.dll*”srv*” -> “symsrv*symsrv.dll*”  심볼 저장소로부터 자동으로심볼 저장소로부터 자동으로 PDBPDB 파일 검사파일 검사  자동으로 바이너리 파일 검사자동으로 바이너리 파일 검사  심볼 경로 문법은 다소 난해심볼 경로 문법은 다소 난해  심볼 서버 설정 후심볼 서버 설정 후 ,, 심볼을 다운로드하기 때심볼을 다운로드하기 때 문에문에 ,, 프로그램 시작이 다소 지연됨프로그램 시작이 다소 지연됨  symchksymchk /r/r c:windowssystem32 /sc:windowssystem32 /s SRV*c:ossymbols*http://msdl.microsoft.com/dowSRV*c:ossymbols*http://msdl.microsoft.com/dow nload/symbolsnload/symbols
  • 14.
    OSOS 심볼 서버경로 지정 방심볼 서버 경로 지정 방 법법 srv*[srv*[ 로컬캐시로컬캐시 *]*] 원격저장소위치원격저장소위치  Project/Properties/Symbol PathProject/Properties/Symbol Path 에 입력에 입력 한다한다 ..  minidumpminidump 사용시에는사용시에는 MODPATH=MODPATH= 인인 자로 넣는다자로 넣는다 ..  로컬 캐시를 사용하면 다음번 디버깅시로컬 캐시를 사용하면 다음번 디버깅시 에 보다 빠르게 사용할 수 있다에 보다 빠르게 사용할 수 있다 ..  원격 경로는 네트워크 주소 및 인터넷원격 경로는 네트워크 주소 및 인터넷 주소로 지정한다주소로 지정한다 ..
  • 15.
    OSOS 심볼 서버경로 지정 순심볼 서버 경로 지정 순 서서 서버로 사용할 컴퓨터 설정서버로 사용할 컴퓨터 설정  예예 )) SYMBOLSSYMBOLS  OSSYMBOLSOSSYMBOLS 이름으로 공유 폴더 생성이름으로 공유 폴더 생성  Debugging Tools for WindowsDebugging Tools for Windows 설치 후설치 후 ,, PATHPATH 환경 변수에 디렉터리 추가환경 변수에 디렉터리 추가  프락시 서버 환경이라면프락시 서버 환경이라면 _NT_SYMBOL_PROXY_NT_SYMBOL_PROXY 환경 변수 설정환경 변수 설정  _NT_SYMBOL_PATH_NT_SYMBOL_PATH 환경 변수 설정환경 변수 설정
  • 16.
    제품 심볼 서버설정제품 심볼 서버 설정  서버로 사용할 컴퓨터 설정서버로 사용할 컴퓨터 설정  예예 )) SYMBOLSSYMBOLS  PRODUCTSYMBOLSPRODUCTSYMBOLS 이름으로 공유 폴이름으로 공유 폴 더 생성더 생성  symstore add /r /f d:build*.* /ssymstore add /r /f d:build*.* /s SYMBOLSproductsymbols /t “MyApp”SYMBOLSproductsymbols /t “MyApp” /v “Build 632” /c “2004/09/14 Daily/v “Build 632” /c “2004/09/14 Daily Build”Build”  삭제 시에는 트랜잭션삭제 시에는 트랜잭션 IDID 사용사용  symstore del /I 00000009 /ssymstore del /I 00000009 /s symbolsproductsymbolssymbolsproductsymbols
  • 17.
    SymbolSymbol 서버 설정서버설정 NotepadNotepad 디버깅디버깅 OSSymbolTestOSSymbolTest ProductSymbolTestProductSymbolTest DemoDemo
  • 18.
    참고자료참고자료  HOW TO:Use a Symbol Server with theHOW 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/issues/0http://msdn.microsoft.com/msdnmag/issues/0  WinDBGWinDBG  SymbolsSymbols 섹션섹션
  • 19.
    WinDBGWinDBG 사용사용  WinDBGWinDBG문서 필독문서 필독  WinDBGWinDBG 기능기능  WinDBGWinDBG 설정 및 사용설정 및 사용  WinDBGWinDBG 는 심볼의 로드되는 경로설정을 위한 다양한 방는 심볼의 로드되는 경로설정을 위한 다양한 방 법제공법제공  다중 프로세스 디버깅다중 프로세스 디버깅  BreakPointBreakPoint 와와 exceptionexception 제어제어  WinDBG commandsWinDBG commands  덤프파일 디버깅덤프파일 디버깅  VS.NET :VS.NET : 개발한 컴퓨터에서 생성된 덤프파일만 작동개발한 컴퓨터에서 생성된 덤프파일만 작동  WinDBG :WinDBG : 고객으로부터 생성된 덤프파일도 가능고객으로부터 생성된 덤프파일도 가능  SOSSOS  ManagedManaged 와와 nativenative 가 혼합된가 혼합된 applicationapplication 의 유일한 디의 유일한 디 버깅 방법버깅 방법
  • 20.
    WinDBGWinDBG 가 무엇인가가무엇인가 ??  탄생배경탄생배경 : OS: OS 의의 debuggingdebugging 자동화를 위함자동화를 위함  VS.NETVS.NET 디버거디버거 , WinDBG, WinDBG  VS.NETVS.NET 디버거는 응용 어플리케이션 개발자디버거는 응용 어플리케이션 개발자  WinDBGWinDBG 는 운영체계를 다루는 개발자를 위함는 운영체계를 다루는 개발자를 위함  Device driverDevice driver 및및 user mode native appuser mode native app 에도 막강한 기에도 막강한 기 능 사용가능능 사용가능  다양한다양한 processprocess 정보정보 ->-> 어렵게 만드는 요인어렵게 만드는 요인 ??  Memory breakpointMemory breakpoint  Mini-dumpMini-dump 를 다룰 수 있도록 향상된 바이너리 제공를 다룰 수 있도록 향상된 바이너리 제공  완전한 운영체제의완전한 운영체제의 heap, processheap, process 의의 handlehandle 정보를 볼정보를 볼 수 있음수 있음  Install dirInstall dir 의의 dubugger.chmdubugger.chm 의 도움말 파일의 도움말 파일  UIUI 는 단순히는 단순히 DBGENG.DLLDBGENG.DLL 을 감싸는 정도이며을 감싸는 정도이며 NTSD(ms symbolic debugger)NTSD(ms symbolic debugger) 와 비슷하므로와 비슷하므로 winDBGwinDBG 를를 익히면익히면 NTSDNTSD 도 쉽게 익힐 수 있음도 쉽게 익힐 수 있음
  • 21.
    WinDBGWinDBG 설치설치  DownloadpageDownload page  http://www.microsoft.com/whdc/devtools/debhttp://www.microsoft.com/whdc/devtools/deb  Overview pageOverview page  http://www.microsoft.com/http://www.microsoft.com/ whdc/devtools/debugging/default.mspxwhdc/devtools/debugging/default.mspx
  • 22.
    WinDBGWinDBG 설정설정  VS.NETsymbol serverVS.NET symbol server  VS.NET symbolVS.NET symbol 서버 설정서버 설정 -> WinDBG-> WinDBG 는 자동으는 자동으 로로 _NT_SYMBOL_PATH_NT_SYMBOL_PATH 환경변수를 기본 심볼경환경변수를 기본 심볼경 로로 사용로로 사용  공통 소스파일을 찾기 위한 작업 필요공통 소스파일을 찾기 위한 작업 필요  _NT_SOURCE_PATH_NT_SOURCE_PATH 환경변수 등록환경변수 등록  WinDBGWinDBG 를 열고를 열고 source search pathsource search path 에 필요정보 입력에 필요정보 입력  WinDBGWinDBG 가 바이너리 파일을 찾기 위한 실행파일가 바이너리 파일을 찾기 위한 실행파일 이미지 경로 설정이미지 경로 설정  File-Image File PathFile-Image File Path 를 이용해 설정를 이용해 설정 :: 개발자개발자 ,, 고객의고객의 dumpdump  CommandCommand 창에 기본 워크스페이스에 색상정창에 기본 워크스페이스에 색상정 보 입력보 입력  엄청난 정보중에엄청난 정보중에 TRACE, OutputDebugStringTRACE, OutputDebugString 등등 의 정보만을 선택하기 위한 작업의 정보만을 선택하기 위한 작업 -> Debuggee-> Debuggee
  • 23.
    WinDBG commandsWinDBG commands WinDBG commandsWinDBG commands 종류종류 // 특징특징  일반명령일반명령  디버기 제어디버기 제어 :: 추정추정 ,, 단계실행단계실행 ,, 메모리 확인등메모리 확인등 등등  메타명령메타명령 (.(. 명령명령 ))  디버거와 디버깅 방법 제어디버거와 디버깅 방법 제어 :: 로그파일생성로그파일생성 ,, 프로세스 연결프로세스 연결 ,, 덤프파일 작성 등등덤프파일 작성 등등  확장명령확장명령  디버기를 제어하고 현재 상태분석디버기를 제어하고 현재 상태분석 :: 덤프처리덤프처리 ,, 임계세션 분석임계세션 분석 ,, 충돌분석 등등충돌분석 등등  일반일반 ,, 메타 명령은 대소문자 구별메타 명령은 대소문자 구별 X,X, 확장확장 명령 구분명령 구분
  • 24.
    심볼 로드심볼 로드 WinDGBWinDGB 심볼처리 우수함심볼처리 우수함  VS.NETVS.NET 보다 심볼처리 뛰어나며보다 심볼처리 뛰어나며 VS.NETVS.NET 은 로드된 심볼을 확인할 수 없으므로 필자은 로드된 심볼을 확인할 수 없으므로 필자 는는 VS.NETVS.NET 을 사용하기 전에을 사용하기 전에 WinDBGWinDBG 를를 이용한다고함이용한다고함 (winDBG(winDBG 의의 lmlm 으로 확인으로 확인 가능가능 ))  Lm v m : v-Lm v m : v- 자세한 정보자세한 정보 , m-module, m-module  AnytimeAnytime  Lazy symbol loading(save memory)Lazy symbol loading(save memory)  Ex) kernel debuggingEx) kernel debugging 시시 NTDLL.DLLNTDLL.DLL 만 로딩만 로딩  LD(load symbol) :LD(load symbol) : 강제 로딩강제 로딩  실행파일을실행파일을 loadload 할 경우할 경우 buildbuild 를를 /checksum/checksum 으로 하여야 함으로 하여야 함
  • 25.
    Process & ThreadProcess& Thread  Multi-process debuggingMulti-process debugging  VS.NET, WinDBGVS.NET, WinDBG 모두 가능모두 가능  WinDBGWinDBG 가가 process controlprocess control 이 더 우수함이 더 우수함  CommandsCommands  .childdbg option.childdbg option 변경변경  | : process status| : process status  . :. : 활성화된활성화된 processprocess  # : WinDBG# : WinDBG 에서 실행을 중단하기위해 예외를 발생시킨에서 실행을 중단하기위해 예외를 발생시킨 processprocess  ~ : thread status~ : thread status  .create c:winntsystem32sol.exe.create c:winntsystem32sol.exe  .attach : tlist->.attach : tlist-> 실행 중실행 중 process attachprocess attach  Child process debugging exampleChild process debugging example
  • 26.
    실행실행 ,, 단계실행단계 실행 ,, 추적추적  WinDBGWinDBG 의의 G(go), T(trace), P(step)G(go), T(trace), P(step)  F5F5 로 실행은 하거나로 실행은 하거나 shift + F11shift + F11 등의 단축키는등의 단축키는 g,g, tt 등의 명령을 수행하는 것 뿐임등의 명령을 수행하는 것 뿐임  데이터 추적데이터 추적 ,, 조사조사 (p443)(p443)  DV :DV : 변수의 값변수의 값 , DT :, DT : 변수변수 typetype  성능과 관련된 문제를 해결할 경우 예를 들어성능과 관련된 문제를 해결할 경우 예를 들어 STLSTL 같은 경우같은 경우 debugdebug 가 어려움가 어려움 -> wt(trace and-> wt(trace and watch data)watch data) 명령어에 시간을 투자해 연구해야 함명령어에 시간을 투자해 연구해야 함 ,, 즉즉 wtwt 명령을 실행하면서명령을 실행하면서 kernel modekernel mode 변환이 얼변환이 얼 마나 발생하는지 여부마나 발생하는지 여부 (( 성능의 핵심성능의 핵심 )) 를 측정하여를 측정하여 kmkm 변환을 피하는 방법을 강구변환을 피하는 방법을 강구 ->-> 성능 향상성능 향상  로그를 이용한로그를 이용한 dump : .logopen(filename) ,dump : .logopen(filename) , .logappend, .logclose.logappend, .logclose 등의등의 metameta 명령을 이용명령을 이용
  • 27.
    실행실행 ,, 단계실행단계 실행 ,, 추적추적  BreakpointBreakpoint  일반적인일반적인 breakpointbreakpoint  BP : memory addressBP : memory address 를 이용함를 이용함  BU :BU : 심볼을 이용함심볼을 이용함  BL : breakpoint listBL : breakpoint list  BE, BD : breakpoint enable/disableBE, BD : breakpoint enable/disable  JJ 표현식표현식 ?? 참 명령참 명령 ;; 거짓 명령거짓 명령  Memory accessMemory access  BA : BPBA : BP 인인 memory addressmemory address 를 이용해를 이용해 debuggingdebugging 을 하을 하 고고 DVDV 를 이용해 변수 주소를 확인해서 사용가능를 이용해 변수 주소를 확인해서 사용가능  예외와 이벤트예외와 이벤트  Access violationAccess violation 도 포함됨도 포함됨  CommandCommand 도 지원하지만도 지원하지만 debug-event filtersdebug-event filters menumenu 이용 권장이용 권장  P451P451 예외 브레이크 상태 참조예외 브레이크 상태 참조
  • 28.
    WinDBGWinDBG 제어하기제어하기  추가적인메타 명령들추가적인 메타 명령들  .cls : clear screen.cls : clear screen  .enable_unicode : unicode.enable_unicode : unicode  .locale.locale  .formats.formats  .shell.shell  .occommand : outputdebugstring.occommand : outputdebugstring 함수 호함수 호 출시 접두사 명시출시 접두사 명시
  • 29.
    확장 기능확장 기능 확장기능 로드확장기능 로드 ,, 제어제어  .chain.chain 으로 로드된 확장기능 검토으로 로드된 확장기능 검토  SOSSOS 를를 loadload 하면 이 부분에하면 이 부분에 SOS.dllSOS.dll 이 추가됨을 알 수이 추가됨을 알 수 있음있음  .load sos : .dll.load sos : .dll 은 생략해야 함은 생략해야 함  .load, .unload.load, .unload 로 확장로 확장 dll load & unloaddll load & unload  중요한 확장 명령들중요한 확장 명령들  !analyze –v :!analyze –v : 현재 예외에 대한 간단한 분석정보현재 예외에 대한 간단한 분석정보  !critsec!critsec 주소주소 :: 임계섹션임계섹션  !locks –v :!locks –v : 잠겨진 임계섹션 확인잠겨진 임계섹션 확인  !token : thread!token : thread 에 적용된 보안 정보에 적용된 보안 정보  !handle :!handle : 핸들을 포함하는 객체타입 및 요약정보핸들을 포함하는 객체타입 및 요약정보  메모리메모리 leak, deadlock debugleak, deadlock debug 중요한중요한 debuggingdebugging
  • 30.
    덤프파일 생성하기덤프파일 생성하기 디버깅 도중디버깅 도중 .DUMP.DUMP 명령으로 파일 생성명령으로 파일 생성  Ex) .dump /a/u c:tempaa.dmpEx) .dump /a/u c:tempaa.dmp 로 하면 실제 파일로 하면 실제 파일 은은 aa_2004-10-15_18-30-13-108_05E8.dmpaa_2004-10-15_18-30-13-108_05E8.dmp 로 생로 생 성성  덤프파일덤프파일 optionoption  /u :/u : 날짜날짜 ,, 시간시간 , PID, PID 를 파일이름으로 추가함를 파일이름으로 추가함  /c :/c : 자세한 정보자세한 정보  /a : load/a : load 된 모든 프로세스에 대한 정보된 모든 프로세스에 대한 정보  /f :/f : 현재현재 thread stackthread stack 부터부터 loadload 된 실제된 실제 binarybinary 에 대한 메모리 데이터까지 모든 정보 포함에 대한 메모리 데이터까지 모든 정보 포함  /m :/m : 일반적인일반적인 mini dump (vs.netmini dump (vs.net 과 동일과 동일 ))  /b : dmp/b : dmp 파일을 압축하여파일을 압축하여 .cab.cab 파일 생성파일 생성
  • 31.
    덤프파일 열기덤프파일 열기 방법방법  WinDBGWinDBG 의 메뉴의 메뉴 (open crash dump)(open crash dump)  덤프파일을 열고 심볼덤프파일을 열고 심볼 ,, 소스소스 ,, 바이너리 경바이너리 경 로 설정로 설정  단계단계  LM /vLM /v 를 이용해 로드된 심볼 확인를 이용해 로드된 심볼 확인 :: 필요필요 시 심볼 경로설정시 심볼 경로설정  이미지 경로 설정이미지 경로 설정  Windows hotfixWindows hotfix 의 경우의 경우 OSSYMS.JSOSSYMS.JS 를 실행하를 실행하 여 심볼 저장소 다시 로드해아함여 심볼 저장소 다시 로드해아함 ..  덤프 디버깅은덤프 디버깅은 WinDBGWinDBG 사용법과 동일사용법과 동일
  • 32.
    SOS(Son of Strike)SOS(Sonof 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>sdkv1.1Tool: <.net install dir>sdkv1.1Tool developers guidesamplessosdevelopers guidesamplessos  상세한 내용은상세한 내용은 sos.htmsos.htm 참조참조
  • 33.
    SOS.dll loadSOS.dll load SOSSOS 는는 .NET Framework.NET Framework 의 일부의 일부  Vsvars32.batVsvars32.bat 실행실행  .net.net 과 관련된과 관련된 dirdir 경로에 포함되도록 환경설정경로에 포함되도록 환경설정  .load sos.load sos 실행실행  ExampleExample  책의책의 sourcesource 의의 exceptapp.exeexceptapp.exe  !thread!thread 를 이용해를 이용해 appDomainappDomain 의 정보를 알수있음의 정보를 알수있음  !clrstack .all!clrstack .all 을 이용해을 이용해 stackstack 확인확인  !dumpstack : .net!dumpstack : .net 과과 nativenative 호출이 많은 프로그호출이 많은 프로그 램을 다루는램을 다루는 appapp 의 호출 스택확인의 호출 스택확인  !dumpclass : class!dumpclass : class 의 모든의 모든 data fielddata field 확인확인  ~~~~
  • 34.
    디버깅 전쟁 이야기디버깅전쟁 이야기  동료와 공유하기 위한 디버깅 과정 기술동료와 공유하기 위한 디버깅 과정 기술 방법방법  사례 실습으로 적극 활용사례 실습으로 적극 활용  훌륭한 디버깅 팁으로 자료 공유훌륭한 디버깅 팁으로 자료 공유  John RobbinsJohn Robbins 가 처음 도입가 처음 도입
  • 35.
    디버깅 전쟁 이야기디버깅전쟁 이야기 #1#1  사건 발단사건 발단  파일 생성이 되지 않는다파일 생성이 되지 않는다 !!  전개전개  fopenfopen 에서 오류가 발생하여 조사식 창에서에서 오류가 발생하여 조사식 창에서 @err,hr@err,hr 을 입력하여을 입력하여 Last ErrorLast Error 값 확인값 확인  ““ 파일의 경로를 찾을 수 없습니다파일의 경로를 찾을 수 없습니다 .”.”  분명히 파일의 경로에 문제가 있음분명히 파일의 경로에 문제가 있음 !!  파일을 여는 두 가지 방법파일을 여는 두 가지 방법  MFCMFC 의의 SDI/MDISDI/MDI 에서 지원하는에서 지원하는 [[ 최근에 사용한 파최근에 사용한 파 일일 ]] 메뉴 이용메뉴 이용  오류 발생하지 않음오류 발생하지 않음 !!  [[ 파일파일 ]-[]-[ 열기열기 ]] 메뉴 이용메뉴 이용  오류 발생오류 발생 !!
  • 36.
    디버깅 전쟁 이야기디버깅전쟁 이야기 #1#1  전개전개  상대 경로의 주소는 다음과 같이 선언되어 있상대 경로의 주소는 다음과 같이 선언되어 있 음음  #define FILE_SAVE_PATH “Data/result.dat”#define FILE_SAVE_PATH “Data/result.dat”  상대 경로를 절대 경로로 바꾸니 성공상대 경로를 절대 경로로 바꾸니 성공 !!  분석분석  [[ 최근에 사용한 파일최근에 사용한 파일 ]] 메뉴는 절대 경로를 이메뉴는 절대 경로를 이 용하는 방법용하는 방법  [[ 파일파일 ]-[]-[ 열기열기 ]] 사용시에는 프로그램의 실행사용시에는 프로그램의 실행 경로가 파일을 열었던 경로로 바뀌어 버림경로가 파일을 열었던 경로로 바뀌어 버림  해결해결  프로그램 시작 시 실행 경로를 저장하여프로그램 시작 시 실행 경로를 저장하여 ,, 상상 대 경로가 필요할 때마다 저장된 경로를 이용대 경로가 필요할 때마다 저장된 경로를 이용
  • 37.
    디버깅 전쟁 이야기디버깅전쟁 이야기 #1#1  교훈교훈  상대 경로를 이용하는 프로그램은 어떤 외부상대 경로를 이용하는 프로그램은 어떤 외부 적인 요인에 의해서 현재 경로가 바뀔 수 있적인 요인에 의해서 현재 경로가 바뀔 수 있 음을 주의해야 함음을 주의해야 함  디버깅을 하기 전에 여러 가지 테스트 케이스디버깅을 하기 전에 여러 가지 테스트 케이스 를 미리 정해놓고 디버깅을 시작하는 것이 도를 미리 정해놓고 디버깅을 시작하는 것이 도 움이 됨움이 됨
  • 38.
    디버깅 전쟁 이야기디버깅전쟁 이야기 #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; }}  pHeadpHead 값이값이 NULLNULL 로 설정로 설정  값을 확인하기 위하여 데이터 중단점 설정값을 확인하기 위하여 데이터 중단점 설정
  • 39.
    디버깅 전쟁 이야기디버깅전쟁 이야기 #2#2  전개전개 (( 계속계속 ))
  • 40.
    디버깅 전쟁 이야기디버깅전쟁 이야기 #2#2  전개전개 (( 계속계속 ))  데이터 중단점을 통해서 변수의 값들을 확데이터 중단점을 통해서 변수의 값들을 확 인인  교훈교훈  포인터 개념을 정확하게 이해하도록 하자포인터 개념을 정확하게 이해하도록 하자 ..  디버거의 기능을 충분히 활용하도록 하자디버거의 기능을 충분히 활용하도록 하자 ..
  • 41.
    디버거 작동 원리디버거작동 원리  Win32Win32 디버거는디버거는 WindowsWindows 의 기능을의 기능을 사용한다사용한다 ..  요구 사항요구 사항  CreateProcessCreateProcess 의의 dwCreationFlagsdwCreationFlags 매개매개 변수에변수에 DEBUG_ONLY_THIS_PROCESSDEBUG_ONLY_THIS_PROCESS 설정설정  디버기를 시작하고 나서디버기를 시작하고 나서 WaitForDebugEvent APIWaitForDebugEvent API 함수를 호출하여함수를 호출하여 루프로 진입루프로 진입  이벤트를 처리하고 난 후에는이벤트를 처리하고 난 후에는 ContinueDebugEventContinueDebugEvent 함수 호출함수 호출 
  • 42.
    디버거의 기본 골격코드디버거의 기본 골격 코드 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 ( … ); }} }}
  • 43.
    디버깅 이벤트디버깅 이벤트 DEBUG_EVENTDEBUG_EVENT 구조체구조체 (( 내부적으로내부적으로 unionunion 구조구조 )) 에 모든 데이터가 들어옴에 모든 데이터가 들어옴  CREATE_PROCESS_DEBUG_EVENTCREATE_PROCESS_DEBUG_EVENT  새로운 프로세스가 디버깅되는 프로세스새로운 프로세스가 디버깅되는 프로세스 내에서 생성될 때나 디버거가 이미 활성화내에서 생성될 때나 디버거가 이미 활성화 되어 있는 프로세스를 디버깅할 때마다 발되어 있는 프로세스를 디버깅할 때마다 발 생생  CREATE_THREAD_DEBUG_EVENTCREATE_THREAD_DEBUG_EVENT  새로운 스레드가 시작할 때 발생새로운 스레드가 시작할 때 발생  EXCEPTION_DEBUG_EVENTEXCEPTION_DEBUG_EVENT  디버기에서 예외가 발생할 때 발생디버기에서 예외가 발생할 때 발생
  • 44.
    디버깅 이벤트디버깅 이벤트 EXIT_PROCESS_DEBUG_EVENTEXIT_PROCESS_DEBUG_EVENT  마지막 스레드가 디버거를 나갈 때나마지막 스레드가 디버거를 나갈 때나 ExitProcessExitProcess 함수를 호출할 때함수를 호출할 때  EXIT_THREAD_DEBUG_EVENTEXIT_THREAD_DEBUG_EVENT  디버기의 스레드가 종료할 때 발생디버기의 스레드가 종료할 때 발생  디버거가 이 핸들을 닫아서는 안됨디버거가 이 핸들을 닫아서는 안됨  LOAD_DLL_DEBUG_EVENTLOAD_DLL_DEBUG_EVENT  디버기가디버기가 DLLDLL 을 로드할 때 발생을 로드할 때 발생  OUTPUT_DEBUG_STRING_EVENTOUTPUT_DEBUG_STRING_EVENT  디버기가디버기가 OutputDebugStringOutputDebugString 함수 호출할 때 발함수 호출할 때 발 생생  UNLOAD_DLL_DEBUG_EVENTUNLOAD_DLL_DEBUG_EVENT  디버기가디버기가 FreeLibraryFreeLibrary 로로 DLLDLL 을 언로드할 때 발을 언로드할 때 발
  • 45.
    디버거 작성 시주의 사항디버거 작성 시 주의 사항  WriteProcessMemoryWriteProcessMemory 함수를 호출하여함수를 호출하여 디버기의 코드를 고치는 경우디버기의 코드를 고치는 경우 ,, FlushInstructionCacheFlushInstructionCache 함수를 호출하함수를 호출하 여 업데이트 해주어야 함여 업데이트 해주어야 함  중단점이 활성화되면중단점이 활성화되면 ContinueDebugEventContinueDebugEvent 함수를 호출해야함수를 호출해야 한다한다 ..
  • 46.
  • 47.
  • 48.
    메모리 값의 의미메모리값의 의미  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 로 해제된 값로 해제된 값 .. 사용하려는 값이 해제되었는지 확사용하려는 값이 해제되었는지 확 인하기 위해서 사용가능인하기 위해서 사용가능  0xFD0xFD  DEBUG_NEWDEBUG_NEW 가 정의되어 있을 때가 정의되어 있을 때 ,, 메모리 영역을 보호하기 위하메모리 영역을 보호하기 위하 여 메모리 공간 앞뒤에 추가함여 메모리 공간 앞뒤에 추가함
  • 49.
    디버거 자동 실행디버거자동 실행  응용 프로그램이 시작하면서 디버거가응용 프로그램이 시작하면서 디버거가 자동을 실행자동을 실행  WindowsWindows 서비스와서비스와 COMCOM 아웃아웃 -- 오브오브 -- 프프 로세스에서 유용로세스에서 유용  HKEY_LOCAL_MACHINESOFTWAREMHKEY_LOCAL_MACHINESOFTWAREM icrosoftWindowsNTCurrentVersionImicrosoftWindowsNTCurrentVersionIm age File Execution Optionsage File Execution Options 키에서 응용키에서 응용 프로그램의 파일 이름과 동일 이름의 키프로그램의 파일 이름과 동일 이름의 키 를 생성를 생성  DebuggerDebugger 문자열 값문자열 값 :: 실행하고자 하는실행하고자 하는 디버거의 전체 경로와 파일 이름 입력디버거의 전체 경로와 파일 이름 입력
  • 50.
    배열의 특정 범위만확인배열의 특정 범위만 확인  크기가크기가 50005000 인 배열에서인 배열에서 , 2000, 2000 번째 부번째 부 터터 1010 개 요소만 확인하고 싶을때개 요소만 확인하고 싶을때  Char pFoo[5000];Char pFoo[5000];  WatchWatch 창에서창에서 (pFoo + 2000) , 10(pFoo + 2000) , 10
  • 51.
    DirectXDirectX 데이터 표시데이터표시  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>_D3DDISPLAYMODE =w=<Width> h=<Height> Hz=<RefreshRate> Fmt=<Format>Hz=<RefreshRate> Fmt=<Format> _D3DVIEWPORT8 =x=<x> y=<y> width=<Width>_D3DVIEWPORT8 =x=<x> y=<y> width=<Width> height=<Height>height=<Height> (Visual C++ 6.0(Visual C++ 6.0 에서도 가능에서도 가능 ))
  • 52.
    스레드 이름 설정스레드이름 설정 typedef struct tagTHREADNAME_INFOtypedef struct tagTHREADNAME_INFO {{ DWORDDWORD dwType;dwType; // must be 0x1000// must be 0x1000 LPCSTRLPCSTR 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) {{ }}
  • 53.
    콘솔콘솔 TRACETRACE  제품디버깅 시에도 활용 가능제품 디버깅 시에도 활용 가능  AllocConsoleAllocConsole 와와 FreeConsole APIFreeConsole API 활용활용  프로그램의 상태를 확인하기 위하여 실프로그램의 상태를 확인하기 위하여 실 행 옵션 이용행 옵션 이용
  • 54.
    SP2SP2 에서의 원격디버깅에서의 원격 디버깅  DCOMDCOM 설정설정 (Visual Studio Computer)(Visual Studio Computer)  DCOMCNFGDCOMCNFG 실행실행  Component ServicesComponent Services  컴퓨터컴퓨터  내 컴퓨터 클릭후에 내 컴퓨내 컴퓨터 클릭후에 내 컴퓨 터 구성 버튼 클릭터 구성 버튼 클릭  기본기본 COMCOM 보안 탭에서 액세스 권한에보안 탭에서 액세스 권한에 ANONYMOUS LOGONANONYMOUS LOGON 추가 후추가 후 ,, 원격 접속 권한 허용원격 접속 권한 허용  WindowsWindows 방화벽 설정방화벽 설정 (VS(VS 와 원격 모두와 원격 모두 ))  DebuggerFirewallConfiguration.exeDebuggerFirewallConfiguration.exe 파일 다운로드파일 다운로드  ASP, ASP.NET, ATLASP, ASP.NET, ATL 서버 디버깅서버 디버깅  Enable Web Server Debugging :Enable Web Server Debugging : KB 833977KB 833977  스크립트 디버깅스크립트 디버깅  Enable Script Debugging :Enable Script Debugging : KB 833977KB 833977  원격원격 T-SQLT-SQL 디버깅디버깅  현재로서는 불가능현재로서는 불가능 , SP, SP 제공 후 지원 가능제공 후 지원 가능  관리자 권한을 갖고 있지 않은 개발자관리자 권한을 갖고 있지 않은 개발자  Run the debugger as a normal user :Run the debugger as a normal user : KB 833977KB 833977
  • 55.
    프로세스 다루기프로세스 다루기 Process KillProcess Kill  작업 관리자작업 관리자 , Process Explorer,, Process Explorer, Taskkill(Windows XP+)Taskkill(Windows XP+)  우선 순위 다루기우선 순위 다루기  ntsd taskmgrntsd taskmgr 로로 SeDebugPrivilegeSeDebugPrivilege 획득획득  ntsd –hd –c “qd” taskmgrntsd –hd –c “qd” taskmgr  -hd :-hd : 일반 힙 사용일반 힙 사용  -c :-c : 첫번째 명령 실행첫번째 명령 실행
  • 56.
    실행 순서 확인실행순서 확인  ManagedManaged 응용 프로그램의 실행 순서 확인응용 프로그램의 실행 순서 확인  프로그램의 전체적인 흐름을 살펴볼 수 있다프로그램의 전체적인 흐름을 살펴볼 수 있다 ..  프로파일링프로파일링 (Profiling)(Profiling) 과 같은 기능과 같은 기능  CORDBG.EXECORDBG.EXE 의의 wtwt 명령명령 (cordbg) wt(cordbg) wt 1 App::Main1 App::Main 3 App::Foo3 App::Foo 3 App::Bar3 App::Bar 5 App::Baz5 App::Baz 3 App::Bar3 App::Bar 3 App::Foo3 App::Foo 3 App::Main3 App::Main 21 instructions total21 instructions total
  • 57.
    디버그디버그 FA-KBFA-KB  Debuggerslow 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
  • 58.
    ExceptionException 의 두가지타입의 두가지 타입  First Chance ExceptionFirst Chance Exception  디버기에서 발생하는 이벤트를 디버거가디버기에서 발생하는 이벤트를 디버거가 가로챘을 때의가로챘을 때의 ExceptionException  디버거는 이디버거는 이 ExceptionException 을 디버기가 처리을 디버기가 처리 할 수 있도록 넘김할 수 있도록 넘김  Second chance ExceptionSecond chance Exception  디버거가 전달한디버거가 전달한 ExceptionException 을 디버기가을 디버기가 처리하지 못하면 디버거로 다시처리하지 못하면 디버거로 다시 ExceptionException 이 날아옴이 날아옴  디버기가디버기가 ExceptionException 을 처리하지 못했기을 처리하지 못했기 때문에 오류 발생때문에 오류 발생 !!
  • 59.
    © 2004 MicrosoftCorporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

Editor's Notes

  • #8 &amp;lt;number&amp;gt;
  • #18 &amp;lt;number&amp;gt;
  • #47 &amp;lt;number&amp;gt;