SlideShare a Scribd company logo
서우석서우석
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.

More Related Content

What's hot

[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규ChangKyu Song
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
Seo YoungHoon
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
Sungchul Park
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
Sungchul Park
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
wonmin lee
 
19.debugger detected and anti anti-techniques hangul
19.debugger detected and anti anti-techniques hangul19.debugger detected and anti anti-techniques hangul
19.debugger detected and anti anti-techniques hangul
re4lfl0w
 
Work With Engineer
Work With EngineerWork With Engineer
Work With Engineer
Sungchul Park
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
Dong Chan Shin
 
Exception&log
Exception&logException&log
Exception&log
Nam Hyeonuk
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기Heo Seungwook
 
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
우영 주
 
PSR - Code Convention
PSR - Code ConventionPSR - Code Convention
PSR - Code Convention
jhyeon1010
 
[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅종빈 오
 
시작하자 단위테스트
시작하자 단위테스트시작하자 단위테스트
시작하자 단위테스트
YongEun Choi
 
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
Sung Eun Kim
 
Tdd retro agile_korea_게시용
Tdd retro agile_korea_게시용Tdd retro agile_korea_게시용
Tdd retro agile_korea_게시용Sangcheol Hwang
 
스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동
Sungchul Park
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어
NAVER D2
 

What's hot (19)

[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
 
19.debugger detected and anti anti-techniques hangul
19.debugger detected and anti anti-techniques hangul19.debugger detected and anti anti-techniques hangul
19.debugger detected and anti anti-techniques hangul
 
Work With Engineer
Work With EngineerWork With Engineer
Work With Engineer
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 
Exception&log
Exception&logException&log
Exception&log
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
[Toolcon2014] WebStorm에서 자바스크립트 리팩토링하기
 
PSR - Code Convention
PSR - Code ConventionPSR - Code Convention
PSR - Code Convention
 
[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅
 
시작하자 단위테스트
시작하자 단위테스트시작하자 단위테스트
시작하자 단위테스트
 
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
 
Tdd retro agile_korea_게시용
Tdd retro agile_korea_게시용Tdd retro agile_korea_게시용
Tdd retro agile_korea_게시용
 
스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동스프링 코어 강의 1부 - 봄 맞이 준비 운동
스프링 코어 강의 1부 - 봄 맞이 준비 운동
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어
 

Viewers also liked

[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
GangSeok Lee
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
Ji Hun Kim
 
보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법
Youngjun Chang
 
실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부
hyun soomyung
 
Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]
sweetchip
 
Inc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipInc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchip
sweetchip
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012Esun Kim
 
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
Sang Don Kim
 

Viewers also liked (8)

[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
 
Windbg랑 친해지기
Windbg랑 친해지기Windbg랑 친해지기
Windbg랑 친해지기
 
보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법
 
실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부실전 윈도우 디버깅. Ch3. 디버거 해부
실전 윈도우 디버깅. Ch3. 디버거 해부
 
Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]Codegate 2014 - Bug Hunting Challenge [Track0]
Codegate 2014 - Bug Hunting Challenge [Track0]
 
Inc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchipInc0gnito fuzzing for_fun_sweetchip
Inc0gnito fuzzing for_fun_sweetchip
 
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
 
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
 

Similar to Windows Debugging Technique #3

효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축guest0ad316e
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
Lusain Kim
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
YEONG-CHEON YOU
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
Leonardo YongUk Kim
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션
codercay
 
java_1장
java_1장java_1장
java_1장
HeeJung Chae
 
java_1장.pptx
java_1장.pptxjava_1장.pptx
java_1장.pptx
HeeJung Chae
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
Jongwon Han
 
java_1장.pptx
java_1장.pptxjava_1장.pptx
java_1장.pptx
ssuserdfc8b1
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDBNakCheon Jung
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
if kakao
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
hanbeom Park
 
(111217) #fitalk rootkit tools and debugger
(111217) #fitalk   rootkit tools and debugger(111217) #fitalk   rootkit tools and debugger
(111217) #fitalk rootkit tools and debugger
INSIGHT FORENSIC
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
Jaeseung Ha
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
Park Jonggun
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
정출 김
 
cross compile
cross compilecross compile
cross compile
he4722
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
복연 이
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST_NHNent
 

Similar to Windows Debugging Technique #3 (20)

효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축효과적인 임베디드 디버깅 환경구축
효과적인 임베디드 디버깅 환경구축
 
당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계안드로이드 빌드: 설탕없는 세계
안드로이드 빌드: 설탕없는 세계
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션
 
java_1장
java_1장java_1장
java_1장
 
java_1장.pptx
java_1장.pptxjava_1장.pptx
java_1장.pptx
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
 
java_1장.pptx
java_1장.pptxjava_1장.pptx
java_1장.pptx
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDB
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
 
(111217) #fitalk rootkit tools and debugger
(111217) #fitalk   rootkit tools and debugger(111217) #fitalk   rootkit tools and debugger
(111217) #fitalk rootkit tools and debugger
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
 
cross compile
cross compilecross compile
cross compile
 
Mongodb tip42 50
Mongodb tip42 50Mongodb tip42 50
Mongodb tip42 50
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)TOAST Meetup2015 - 구름 Cloud IDE (류성태)
TOAST Meetup2015 - 구름 Cloud IDE (류성태)
 

Windows Debugging Technique #3

  • 1. 서우석서우석 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
  • 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> 를 눌러 중단점 설정 가능를 눌러 중단점 설정 가능  한 줄에 하나 이상의 중단점 설정 가능한 줄에 하나 이상의 중단점 설정 가능
  • 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 툴툴  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
  • 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 설치설치  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
  • 22. 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
  • 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(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 참조참조
  • 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 함수를 호출해야함수를 호출해야 한다한다 ..
  • 47. Tips & TricksTips & Tricks
  • 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  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
  • 58. ExceptionException 의 두가지 타입의 두가지 타입  First Chance ExceptionFirst Chance Exception  디버기에서 발생하는 이벤트를 디버거가디버기에서 발생하는 이벤트를 디버거가 가로챘을 때의가로챘을 때의 ExceptionException  디버거는 이디버거는 이 ExceptionException 을 디버기가 처리을 디버기가 처리 할 수 있도록 넘김할 수 있도록 넘김  Second chance ExceptionSecond chance Exception  디버거가 전달한디버거가 전달한 ExceptionException 을 디버기가을 디버기가 처리하지 못하면 디버거로 다시처리하지 못하면 디버거로 다시 ExceptionException 이 날아옴이 날아옴  디버기가디버기가 ExceptionException 을 처리하지 못했기을 처리하지 못했기 때문에 오류 발생때문에 오류 발생 !!
  • 59. © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

Editor's Notes

  1. &amp;lt;number&amp;gt;
  2. &amp;lt;number&amp;gt;
  3. &amp;lt;number&amp;gt;