SlideShare une entreprise Scribd logo
1  sur  29
서우석서우석
http://www.debuglab.comhttp://www.debuglab.com 운영자운영자
(seaousak@hotmail.com)(seaousak@hotmail.com)
Go to Debugging World #2Go to Debugging World #2
- Native Debugging- Native Debugging
AgendaAgenda
 버그 예방책버그 예방책
 Native Debugging with VC++ 6Native Debugging with VC++ 6
 AssemblyAssembly 코드 보기코드 보기
누구를 위한 웹 캐스트인가누구를 위한 웹 캐스트인가
?? Visual C++ 6.0Visual C++ 6.0 디버거를 제대로 활용하디버거를 제대로 활용하
고 싶은 개발자고 싶은 개발자
 버그를 예방하는 방법에 대해서 고민하버그를 예방하는 방법에 대해서 고민하
고 있는 개발자고 있는 개발자
 AssemblyAssembly 코드만 보면 디버그 창을 닫코드만 보면 디버그 창을 닫
아버리는 개발자아버리는 개발자
 AssemblyAssembly 의 ‘의 ‘ A’A’ 자만 들어도 겁이 나는자만 들어도 겁이 나는
개발자개발자
버그 예방책버그 예방책
 디버깅을 잘하는 것보다 미리 예방하는디버깅을 잘하는 것보다 미리 예방하는
것이 더 중요것이 더 중요 !!
 소 잃고 외양간 고치기소 잃고 외양간 고치기 ??
 버그 예방버그 예방 == 디버깅디버깅
 ASSERT!ASSERT!
ASSERTASSERT
 어설트의 대상이 되는 조건이 참이어야어설트의 대상이 되는 조건이 참이어야
함함
 거짓거짓 (FALSE)(FALSE) 이면 오류 발생이면 오류 발생
 릴리즈 시에는 포함되지 않기 때문에릴리즈 시에는 포함되지 않기 때문에 ,,
주로 테스트를 위하여 사용주로 테스트를 위하여 사용
 문서화 역할도 수행문서화 역할도 수행
ASSERTASSERT 할 대상은 무엇할 대상은 무엇 ??
 가능한 모든 것가능한 모든 것 !!
 프로그램을 작성하면서 가정하고 있는프로그램을 작성하면서 가정하고 있는
사항들사항들
 ““ 이 변수는 이 값을 가져야 해이 변수는 이 값을 가져야 해 .”.”
 ““ 이 식의 결과는 이 값을 가져야 해이 식의 결과는 이 값을 가져야 해 .”.”
 ““ 이 함수로 들어오는 매개 변수는 절대로이 함수로 들어오는 매개 변수는 절대로
이 값을 가져서는 안돼이 값을 가져서는 안돼 .”.”
 매개 변수로 들어오는 값매개 변수로 들어오는 값 ,, 리턴 되는 값리턴 되는 값
ASSERTASSERT 사용 시 주의 사항사용 시 주의 사항
 Be a smart guy!Be a smart guy!
 실패할 수 있는 모든 사항에 대하여 어설트실패할 수 있는 모든 사항에 대하여 어설트
를 하지는 않는다를 하지는 않는다 ..
 예예 )) 데이터베이스 연결이 실패했을 때마다 어데이터베이스 연결이 실패했을 때마다 어
설트가 실패하면 프로그램이 진행되지 않는다설트가 실패하면 프로그램이 진행되지 않는다 ..
 심각한 오류에 대해서만 어설트를 한다심각한 오류에 대해서만 어설트를 한다 ..
 논리적인 상황에 대한 어설트는 별도의논리적인 상황에 대한 어설트는 별도의
어설트 함수로 작성한다어설트 함수로 작성한다 ..
 예예 ) AssertTableExist) AssertTableExist
ASSERTASSERT 사용사용
 ManagedManaged 환경환경
 Debug.Assert / Debug.TraceDebug.Assert / Debug.Trace
 Debug.Assert ( i > 3 )Debug.Assert ( i > 3 )
 NativeNative 환경환경
 _ASSERTE / TRACE_ASSERTE / TRACE
 ASSERT ( i > 3 )ASSERT ( i > 3 )
 MFCMFC 환경환경
 ASSERT_KINDOFASSERT_KINDOF
 Cobject::IsKindOfCobject::IsKindOf 메서드의 래퍼메서드의 래퍼
 ASSERT_VALIDASSERT_VALID
 포인터가포인터가 CObjectCObject 에서 파생된 클래스인지 검에서 파생된 클래스인지 검
증한다증한다 ..
어설셜을 위한 헬퍼 함수들어설셜을 위한 헬퍼 함수들
 IsBadCodePtrIsBadCodePtr
 메모리 포인터를 실행할 수 있는지 검사한다메모리 포인터를 실행할 수 있는지 검사한다 ..
 IsBadReadPtrIsBadReadPtr
 메모리 포인터가 특정한 바이트만큼 읽을 수 있는메모리 포인터가 특정한 바이트만큼 읽을 수 있는
지 검사한다지 검사한다 ..
 IsBadStringPtrIsBadStringPtr
 문자열 포인터를문자열 포인터를 nullnull 종결자가 나올 때까지 혹은종결자가 나올 때까지 혹은
지정된 문자의 최대 수까지 읽을 수 있는 검사한지정된 문자의 최대 수까지 읽을 수 있는 검사한
다다 ..
 IsBadWritePtrIsBadWritePtr
 메모리 포인터에 지정된 바이트만큼 쓸 수 있는지메모리 포인터에 지정된 바이트만큼 쓸 수 있는지
검사한다검사한다 ..
 IsWindowIsWindow

Native DebuggingNative Debugging
 기본적인 중단점 설정 방법기본적인 중단점 설정 방법
 디버거 관련 창 사용 방법디버거 관련 창 사용 방법
 고급 중단점 활용 방법고급 중단점 활용 방법
기본적인 디버깅 설정 방법기본적인 디버깅 설정 방법
 중단점중단점 (BreakPoint)(BreakPoint)
 프로그램의 실행을 중단시키기 위한 위치프로그램의 실행을 중단시키기 위한 위치
 줄 단위로만 설정 가능줄 단위로만 설정 가능
 VS .NETVS .NET 에서는 명령 별로 설정 가능에서는 명령 별로 설정 가능
 중단점 설정중단점 설정 (F9)(F9)
 버그가 발생되었다고 생각되는 부분 혹은버그가 발생되었다고 생각되는 부분 혹은
그 주위에 중단점을 설정한다그 주위에 중단점을 설정한다 ..
 중단점을 설정하기 전에 두뇌를 이용하여중단점을 설정하기 전에 두뇌를 이용하여
중단점을 설정해야 하는 위치를 정확하게중단점을 설정해야 하는 위치를 정확하게
파악하도록 한다파악하도록 한다 ..
디버깅 기본 기술디버깅 기본 기술
 Step IntoStep Into
 다른 루틴 호출 시 해당 루틴을 확인할 것다른 루틴 호출 시 해당 루틴을 확인할 것
인지 결정인지 결정
 Step OverStep Over
 다른 루틴의 결과만을 확인할 것인지 결정다른 루틴의 결과만을 확인할 것인지 결정
 Step OutStep Out
 호출 스택에 있는 바로 이전 함수로 넘어감호출 스택에 있는 바로 이전 함수로 넘어감
디버거 관련 창 사용 방법디버거 관련 창 사용 방법 --
11 호출 스택호출 스택 (Call Stack)(Call Stack) 확인확인
 문제가 발생한 함수를 호출한 함수 목록 확문제가 발생한 함수를 호출한 함수 목록 확
인인
 로컬로컬 (Local)(Local) 과 자동과 자동 (Auto)(Auto) 창 확인창 확인
 문제가 발생한 위치에서 사용된 지역 변수문제가 발생한 위치에서 사용된 지역 변수
들들
 메모리메모리 (Memory)(Memory)
 VC++ 6.0VC++ 6.0 에서는 오직 하나의 메모리 창만에서는 오직 하나의 메모리 창만
지원지원
 내가 정확히 알고 싶어하는 값이 무엇이내가 정확히 알고 싶어하는 값이 무엇이
며며 ,, 기대하는 값은 무엇인가를 명확하기대하는 값은 무엇인가를 명확하
디버거 관련 창 사용 방법디버거 관련 창 사용 방법 --
22 조사식 창에서 지원하는 여러가지 형식조사식 창에서 지원하는 여러가지 형식
기호기호
 x, X : 16x, X : 16 진수진수
 61541,x : 0x0000F06561541,x : 0x0000F065
 c :c : 단일 문자단일 문자
 0x0065,c : 101 ‘e’0x0065,c : 101 ‘e’
 hr : HRESULThr : HRESULT 또는또는 Win32Win32 오류 코드오류 코드
 0x00000000,hr : S_OK0x00000000,hr : S_OK
 wc : Windowwc : Window 클래스 플래그클래스 플래그
 0x00000040,wc : WC_DEFAULTCHAR0x00000040,wc : WC_DEFAULTCHAR
 wm : Windowswm : Windows 메시지 번호메시지 번호
Basic BPsBasic BPs
DemoDemo
디버깅 고급 기술디버깅 고급 기술 - 1- 1
 충돌 및 잘못된 연산으로 인한 오류의충돌 및 잘못된 연산으로 인한 오류의
대부분은 ‘포인터’의 사용으로 인한 오대부분은 ‘포인터’의 사용으로 인한 오
류류 !!
 메모리의 값이 변경될 때 중단점 활성화메모리의 값이 변경될 때 중단점 활성화
방법방법
 BreakpointsBreakpoints 창 실행창 실행
 DataData 탭에서 검사하고자 하는 메모리의 주탭에서 검사하고자 하는 메모리의 주
소나 변수 이름 입력소나 변수 이름 입력
 필요한 경우필요한 경우 Advanced…Advanced… 에서 소스 코드에서 소스 코드
와 함수 이름 입력와 함수 이름 입력
Data BPsData BPs
DemoDemo
디버깅 고급 기술디버깅 고급 기술 - 2- 2
 조건 중단점조건 중단점
 조건이 맞을 때에만 중단점 활성화조건이 맞을 때에만 중단점 활성화
 반복문에서 특히 유용반복문에서 특히 유용
 내 프로젝트에서 로드하지 않은내 프로젝트에서 로드하지 않은 DLLDLL 에에
대해서도 직접 설정 가능대해서도 직접 설정 가능
 {[function],[source file],[binary module]}{[function],[source file],[binary module]}
 Test.cppTest.cpp 파일의파일의 2020 번째 줄번째 줄
 {,TEST.CPP,},20{,TEST.CPP,},20
 참고참고
 DLLDLL 이이 exportexport 한 함수 목록 확인하기한 함수 목록 확인하기
 Depends.exeDepends.exe
 Dumpbin /exportDumpbin /export
Conditional BPsConditional BPs
DemoDemo
AssemblyAssembly 코드 보기코드 보기
 x86x86 아키텍처가 무엇인가아키텍처가 무엇인가 ??
 레지스터와 호출 규약레지스터와 호출 규약
 플래그와 조건플래그와 조건 ,, 데이터 형식데이터 형식
 x86x86 명령들명령들
 x86x86 디스어셈블리 예제디스어셈블리 예제
x86x86 아키텍처가 무엇인가아키텍처가 무엇인가 ??
 use complex instruction set computeruse complex instruction set computer
(CISC) architecture(CISC) architecture
 modest number of special-purposemodest number of special-purpose
registersregisters
 Many peculiarities(Many peculiarities( 특성특성 ) in the x86) in the x86
instruction are due to the backwardinstruction are due to the backward
compatibility with that processorcompatibility with that processor
레지스터와 호출 규약레지스터와 호출 규약
 32bit registers32bit registers
 eax : Accumulatoreax : Accumulator
 ebx : Base registerebx : Base register
 ecx : Count registerecx : Count register
 edx : Double-precision registeredx : Double-precision register
 esi : Source index registeresi : Source index register
 edi : Destination index registeredi : Destination index register
 ebp : Base pointer registerebp : Base pointer register
 esp : Stack pointeresp : Stack pointer
 Non integer registersNon integer registers
 eip : instruction pointereip : instruction pointer
 flags : flagsflags : flags
레지스터와 호출 규약레지스터와 호출 규약
레지스터와 호출 규약레지스터와 호출 규약
레지스터와 호출 규약레지스터와 호출 규약
 Calling conventionCalling convention
 The register preservation rule is that functions must preserve all registers,The register preservation rule is that functions must preserve all registers,
except for eax, ecx, and edx, which can be changed across a function call,except for eax, ecx, and edx, which can be changed across a function call,
and esp, which must be updated.and esp, which must be updated.
 The function return rule is that the eax register receives function returnThe function return rule is that the eax register receives function return
values if the result is 32 bits or smaller. If the result is 64 bits, then thevalues if the result is 32 bits or smaller. If the result is 64 bits, then the
result is stored in the edx:eax pair.result is stored in the edx:eax pair.
 Win32 (Stdcall) : Function parameters are passed on the stack, pushedWin32 (Stdcall) : Function parameters are passed on the stack, pushed
right to left, and the callee cleans the stack.right to left, and the callee cleans the stack.
 Native C++ (Thiscall) : Function parameters are passed on the stack,Native C++ (Thiscall) : Function parameters are passed on the stack,
pushed right to left, the "this" pointer is passed in the ecx register, andpushed right to left, the "this" pointer is passed in the ecx register, and
the callee cleans the stack.the callee cleans the stack.
 COM(Stdcall for C++) : Function parameters are passed on the stack,COM(Stdcall for C++) : Function parameters are passed on the stack,
pushed right to left, then the "this" pointer is pushed on the stack, andpushed right to left, then the "this" pointer is pushed on the stack, and
then the function is called. The callee cleans the stack.then the function is called. The callee cleans the stack.
 Fastcall : The first two DWORD-or-smaller arguments are passed in theFastcall : The first two DWORD-or-smaller arguments are passed in the
ecx and edx registers. The remaining parameters are passed on theecx and edx registers. The remaining parameters are passed on the
stack, pushed right to left. The callee cleans the stack.stack, pushed right to left. The callee cleans the stack.
 Cdecl : Function parameters are passed on the stack, pushed right toCdecl : Function parameters are passed on the stack, pushed right to
left, and the caller cleans the stack. The Cdecl calling convention isleft, and the caller cleans the stack. The Cdecl calling convention is
used for all functions with variable-length parameters.used for all functions with variable-length parameters.
플래그와 조건플래그와 조건 ,, 데이터 형데이터 형
식식 E, Z : If zero (or comparison equal)E, Z : If zero (or comparison equal)
 NE, NZ : If nonzero (or comparison unequal)NE, NZ : If nonzero (or comparison unequal)
 GE : If greater than or equal to zeroGE : If greater than or equal to zero
 LT, NGE : If less than zeroLT, NGE : If less than zero
 GT : If greater than zeroGT : If greater than zero
 LE, NGT : If less than zeroLE, NGT : If less than zero
 C : If carryC : If carry
 NC : If no carryNC : If no carry
 AE, NB : If above or equal (unsigned greater)AE, NB : If above or equal (unsigned greater)
 B, NAE : If below (unsigned less than)B, NAE : If below (unsigned less than)
 A, NBE : If above (unsigned greater or equal)A, NBE : If above (unsigned greater or equal)
 BE, NA : If below or equal (unsigned less thanBE, NA : If below or equal (unsigned less than
or equal)or equal)
x86x86 명령들명령들
 LEA r, m : Load effective address.LEA r, m : Load effective address.
 LEA eax, [esi+4] means eax = esi + 4.LEA eax, [esi+4] means eax = esi + 4.
 MOV r1/m, r2/m/#n : r1/m = r/m/#nMOV r1/m, r2/m/#n : r1/m = r/m/#n
 PUSH r/m/#n : Push value onto stack.PUSH r/m/#n : Push value onto stack.
 POP r/m : Pop value from stack.POP r/m : Pop value from stack.
 LEAVE : Tear down stack frameLEAVE : Tear down stack frame
 mov esp, ebpmov esp, ebp
 pop ebppop ebp
 ADD, SUB, NEG, INC, DEC, CMP, MUL, IMUL, DIV,ADD, SUB, NEG, INC, DEC, CMP, MUL, IMUL, DIV,
IDIVIDIV
 AND, OR, XOR, NOT, TEST, SHL, SHR, SAR(sign-fill)AND, OR, XOR, NOT, TEST, SHL, SHR, SAR(sign-fill)
 JMP, CALL, RETJMP, CALL, RET
 NOP (0x90), INT 3 (0xCC)NOP (0x90), INT 3 (0xCC)
CallConventionCallConvention
DemoDemo
© 2004 Microsoft Corporation. All rights reserved.
This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

Contenu connexe

Tendances

[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
ChangKyu Song
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
Heo Seungwook
 
[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅
종빈 오
 
Tdd retro agile_korea_게시용
Tdd retro agile_korea_게시용Tdd retro agile_korea_게시용
Tdd retro agile_korea_게시용
Sangcheol Hwang
 

Tendances (19)

간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
 
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
[NDC12] 변화량 분석을 중심으로 한 저비용 고효율의 지속가능한 코드퀄리티 관리법 - 송창규
 
읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
 
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에서 자바스크립트 리팩토링하기
 
시작하자 단위테스트
시작하자 단위테스트시작하자 단위테스트
시작하자 단위테스트
 
[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅[실전 윈도우 디버깅] 13 포스트모템 디버깅
[실전 윈도우 디버깅] 13 포스트모템 디버깅
 
PSR - Code Convention
PSR - Code ConventionPSR - Code Convention
PSR - Code Convention
 
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부 - 봄 맞이 준비 운동
 

En vedette

덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
덤프 파일을 통한 사후 디버깅 실용 테크닉 NDC2012
Esun Kim
 
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
Wooseok Seo
 
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
Sang Don Kim
 

En vedette (10)

[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
 
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
O2O 배달서비스의 기술 혁신기업 요기요 (YOGIYO) 서우석 부사장
 
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
[Td 2015]디버깅, 어디까지 해봤니 당신이 아마도 몰랐을 디버깅 꿀팁 공개(김희준)
 
그로스 해킹 - Growth Hacking
그로스 해킹 - Growth Hacking그로스 해킹 - Growth Hacking
그로스 해킹 - Growth Hacking
 

Similaire à Windows Debugging Technique #2

Memory corruption stack
Memory corruption stackMemory corruption stack
Memory corruption stack
codevania
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별
Han-Byul Jeon
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDB
NakCheon Jung
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
min woog kim
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
진현 조
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
ChangKyu Song
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
SeongHyun Ahn
 

Similaire à Windows Debugging Technique #2 (20)

당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니당신의 디버깅에 니코니코니
당신의 디버깅에 니코니코니
 
Memory corruption stack
Memory corruption stackMemory corruption stack
Memory corruption stack
 
Net debugging 3_전한별
Net debugging 3_전한별Net debugging 3_전한별
Net debugging 3_전한별
 
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique의 발전과 최신 트랜드
 
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영) 파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
파이썬 데이터과학 레벨1 - 초보자를 위한 데이터분석, 데이터시각화 (2020년 이태영)
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
programming with GDB
programming with GDBprogramming with GDB
programming with GDB
 
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
[0312 조진현] good bye dx9
[0312 조진현] good bye dx9[0312 조진현] good bye dx9
[0312 조진현] good bye dx9
 
[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규[NDC08] 최적화와 프로파일링 - 송창규
[NDC08] 최적화와 프로파일링 - 송창규
 
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
[2017 Incognito] 스택 구조 분석을 통한 ROP 기법의 모든 것
 
6. code level reversing
6. code level reversing6. code level reversing
6. code level reversing
 
Assembly 스터디 1
Assembly 스터디 1Assembly 스터디 1
Assembly 스터디 1
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
 
빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)빠르게 활용하는 파이썬3 스터디(ch1~4)
빠르게 활용하는 파이썬3 스터디(ch1~4)
 
Assembly 스터디 2
Assembly 스터디 2Assembly 스터디 2
Assembly 스터디 2
 
NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스NDC11_김성익_슈퍼클래스
NDC11_김성익_슈퍼클래스
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 

Windows Debugging Technique #2

  • 2. AgendaAgenda  버그 예방책버그 예방책  Native Debugging with VC++ 6Native Debugging with VC++ 6  AssemblyAssembly 코드 보기코드 보기
  • 3. 누구를 위한 웹 캐스트인가누구를 위한 웹 캐스트인가 ?? Visual C++ 6.0Visual C++ 6.0 디버거를 제대로 활용하디버거를 제대로 활용하 고 싶은 개발자고 싶은 개발자  버그를 예방하는 방법에 대해서 고민하버그를 예방하는 방법에 대해서 고민하 고 있는 개발자고 있는 개발자  AssemblyAssembly 코드만 보면 디버그 창을 닫코드만 보면 디버그 창을 닫 아버리는 개발자아버리는 개발자  AssemblyAssembly 의 ‘의 ‘ A’A’ 자만 들어도 겁이 나는자만 들어도 겁이 나는 개발자개발자
  • 4. 버그 예방책버그 예방책  디버깅을 잘하는 것보다 미리 예방하는디버깅을 잘하는 것보다 미리 예방하는 것이 더 중요것이 더 중요 !!  소 잃고 외양간 고치기소 잃고 외양간 고치기 ??  버그 예방버그 예방 == 디버깅디버깅  ASSERT!ASSERT!
  • 5. ASSERTASSERT  어설트의 대상이 되는 조건이 참이어야어설트의 대상이 되는 조건이 참이어야 함함  거짓거짓 (FALSE)(FALSE) 이면 오류 발생이면 오류 발생  릴리즈 시에는 포함되지 않기 때문에릴리즈 시에는 포함되지 않기 때문에 ,, 주로 테스트를 위하여 사용주로 테스트를 위하여 사용  문서화 역할도 수행문서화 역할도 수행
  • 6. ASSERTASSERT 할 대상은 무엇할 대상은 무엇 ??  가능한 모든 것가능한 모든 것 !!  프로그램을 작성하면서 가정하고 있는프로그램을 작성하면서 가정하고 있는 사항들사항들  ““ 이 변수는 이 값을 가져야 해이 변수는 이 값을 가져야 해 .”.”  ““ 이 식의 결과는 이 값을 가져야 해이 식의 결과는 이 값을 가져야 해 .”.”  ““ 이 함수로 들어오는 매개 변수는 절대로이 함수로 들어오는 매개 변수는 절대로 이 값을 가져서는 안돼이 값을 가져서는 안돼 .”.”  매개 변수로 들어오는 값매개 변수로 들어오는 값 ,, 리턴 되는 값리턴 되는 값
  • 7. ASSERTASSERT 사용 시 주의 사항사용 시 주의 사항  Be a smart guy!Be a smart guy!  실패할 수 있는 모든 사항에 대하여 어설트실패할 수 있는 모든 사항에 대하여 어설트 를 하지는 않는다를 하지는 않는다 ..  예예 )) 데이터베이스 연결이 실패했을 때마다 어데이터베이스 연결이 실패했을 때마다 어 설트가 실패하면 프로그램이 진행되지 않는다설트가 실패하면 프로그램이 진행되지 않는다 ..  심각한 오류에 대해서만 어설트를 한다심각한 오류에 대해서만 어설트를 한다 ..  논리적인 상황에 대한 어설트는 별도의논리적인 상황에 대한 어설트는 별도의 어설트 함수로 작성한다어설트 함수로 작성한다 ..  예예 ) AssertTableExist) AssertTableExist
  • 8. ASSERTASSERT 사용사용  ManagedManaged 환경환경  Debug.Assert / Debug.TraceDebug.Assert / Debug.Trace  Debug.Assert ( i > 3 )Debug.Assert ( i > 3 )  NativeNative 환경환경  _ASSERTE / TRACE_ASSERTE / TRACE  ASSERT ( i > 3 )ASSERT ( i > 3 )  MFCMFC 환경환경  ASSERT_KINDOFASSERT_KINDOF  Cobject::IsKindOfCobject::IsKindOf 메서드의 래퍼메서드의 래퍼  ASSERT_VALIDASSERT_VALID  포인터가포인터가 CObjectCObject 에서 파생된 클래스인지 검에서 파생된 클래스인지 검 증한다증한다 ..
  • 9. 어설셜을 위한 헬퍼 함수들어설셜을 위한 헬퍼 함수들  IsBadCodePtrIsBadCodePtr  메모리 포인터를 실행할 수 있는지 검사한다메모리 포인터를 실행할 수 있는지 검사한다 ..  IsBadReadPtrIsBadReadPtr  메모리 포인터가 특정한 바이트만큼 읽을 수 있는메모리 포인터가 특정한 바이트만큼 읽을 수 있는 지 검사한다지 검사한다 ..  IsBadStringPtrIsBadStringPtr  문자열 포인터를문자열 포인터를 nullnull 종결자가 나올 때까지 혹은종결자가 나올 때까지 혹은 지정된 문자의 최대 수까지 읽을 수 있는 검사한지정된 문자의 최대 수까지 읽을 수 있는 검사한 다다 ..  IsBadWritePtrIsBadWritePtr  메모리 포인터에 지정된 바이트만큼 쓸 수 있는지메모리 포인터에 지정된 바이트만큼 쓸 수 있는지 검사한다검사한다 ..  IsWindowIsWindow 
  • 10. Native DebuggingNative Debugging  기본적인 중단점 설정 방법기본적인 중단점 설정 방법  디버거 관련 창 사용 방법디버거 관련 창 사용 방법  고급 중단점 활용 방법고급 중단점 활용 방법
  • 11. 기본적인 디버깅 설정 방법기본적인 디버깅 설정 방법  중단점중단점 (BreakPoint)(BreakPoint)  프로그램의 실행을 중단시키기 위한 위치프로그램의 실행을 중단시키기 위한 위치  줄 단위로만 설정 가능줄 단위로만 설정 가능  VS .NETVS .NET 에서는 명령 별로 설정 가능에서는 명령 별로 설정 가능  중단점 설정중단점 설정 (F9)(F9)  버그가 발생되었다고 생각되는 부분 혹은버그가 발생되었다고 생각되는 부분 혹은 그 주위에 중단점을 설정한다그 주위에 중단점을 설정한다 ..  중단점을 설정하기 전에 두뇌를 이용하여중단점을 설정하기 전에 두뇌를 이용하여 중단점을 설정해야 하는 위치를 정확하게중단점을 설정해야 하는 위치를 정확하게 파악하도록 한다파악하도록 한다 ..
  • 12. 디버깅 기본 기술디버깅 기본 기술  Step IntoStep Into  다른 루틴 호출 시 해당 루틴을 확인할 것다른 루틴 호출 시 해당 루틴을 확인할 것 인지 결정인지 결정  Step OverStep Over  다른 루틴의 결과만을 확인할 것인지 결정다른 루틴의 결과만을 확인할 것인지 결정  Step OutStep Out  호출 스택에 있는 바로 이전 함수로 넘어감호출 스택에 있는 바로 이전 함수로 넘어감
  • 13. 디버거 관련 창 사용 방법디버거 관련 창 사용 방법 -- 11 호출 스택호출 스택 (Call Stack)(Call Stack) 확인확인  문제가 발생한 함수를 호출한 함수 목록 확문제가 발생한 함수를 호출한 함수 목록 확 인인  로컬로컬 (Local)(Local) 과 자동과 자동 (Auto)(Auto) 창 확인창 확인  문제가 발생한 위치에서 사용된 지역 변수문제가 발생한 위치에서 사용된 지역 변수 들들  메모리메모리 (Memory)(Memory)  VC++ 6.0VC++ 6.0 에서는 오직 하나의 메모리 창만에서는 오직 하나의 메모리 창만 지원지원  내가 정확히 알고 싶어하는 값이 무엇이내가 정확히 알고 싶어하는 값이 무엇이 며며 ,, 기대하는 값은 무엇인가를 명확하기대하는 값은 무엇인가를 명확하
  • 14. 디버거 관련 창 사용 방법디버거 관련 창 사용 방법 -- 22 조사식 창에서 지원하는 여러가지 형식조사식 창에서 지원하는 여러가지 형식 기호기호  x, X : 16x, X : 16 진수진수  61541,x : 0x0000F06561541,x : 0x0000F065  c :c : 단일 문자단일 문자  0x0065,c : 101 ‘e’0x0065,c : 101 ‘e’  hr : HRESULThr : HRESULT 또는또는 Win32Win32 오류 코드오류 코드  0x00000000,hr : S_OK0x00000000,hr : S_OK  wc : Windowwc : Window 클래스 플래그클래스 플래그  0x00000040,wc : WC_DEFAULTCHAR0x00000040,wc : WC_DEFAULTCHAR  wm : Windowswm : Windows 메시지 번호메시지 번호
  • 16. 디버깅 고급 기술디버깅 고급 기술 - 1- 1  충돌 및 잘못된 연산으로 인한 오류의충돌 및 잘못된 연산으로 인한 오류의 대부분은 ‘포인터’의 사용으로 인한 오대부분은 ‘포인터’의 사용으로 인한 오 류류 !!  메모리의 값이 변경될 때 중단점 활성화메모리의 값이 변경될 때 중단점 활성화 방법방법  BreakpointsBreakpoints 창 실행창 실행  DataData 탭에서 검사하고자 하는 메모리의 주탭에서 검사하고자 하는 메모리의 주 소나 변수 이름 입력소나 변수 이름 입력  필요한 경우필요한 경우 Advanced…Advanced… 에서 소스 코드에서 소스 코드 와 함수 이름 입력와 함수 이름 입력
  • 18. 디버깅 고급 기술디버깅 고급 기술 - 2- 2  조건 중단점조건 중단점  조건이 맞을 때에만 중단점 활성화조건이 맞을 때에만 중단점 활성화  반복문에서 특히 유용반복문에서 특히 유용  내 프로젝트에서 로드하지 않은내 프로젝트에서 로드하지 않은 DLLDLL 에에 대해서도 직접 설정 가능대해서도 직접 설정 가능  {[function],[source file],[binary module]}{[function],[source file],[binary module]}  Test.cppTest.cpp 파일의파일의 2020 번째 줄번째 줄  {,TEST.CPP,},20{,TEST.CPP,},20  참고참고  DLLDLL 이이 exportexport 한 함수 목록 확인하기한 함수 목록 확인하기  Depends.exeDepends.exe  Dumpbin /exportDumpbin /export
  • 20. AssemblyAssembly 코드 보기코드 보기  x86x86 아키텍처가 무엇인가아키텍처가 무엇인가 ??  레지스터와 호출 규약레지스터와 호출 규약  플래그와 조건플래그와 조건 ,, 데이터 형식데이터 형식  x86x86 명령들명령들  x86x86 디스어셈블리 예제디스어셈블리 예제
  • 21. x86x86 아키텍처가 무엇인가아키텍처가 무엇인가 ??  use complex instruction set computeruse complex instruction set computer (CISC) architecture(CISC) architecture  modest number of special-purposemodest number of special-purpose registersregisters  Many peculiarities(Many peculiarities( 특성특성 ) in the x86) in the x86 instruction are due to the backwardinstruction are due to the backward compatibility with that processorcompatibility with that processor
  • 22. 레지스터와 호출 규약레지스터와 호출 규약  32bit registers32bit registers  eax : Accumulatoreax : Accumulator  ebx : Base registerebx : Base register  ecx : Count registerecx : Count register  edx : Double-precision registeredx : Double-precision register  esi : Source index registeresi : Source index register  edi : Destination index registeredi : Destination index register  ebp : Base pointer registerebp : Base pointer register  esp : Stack pointeresp : Stack pointer  Non integer registersNon integer registers  eip : instruction pointereip : instruction pointer  flags : flagsflags : flags
  • 25. 레지스터와 호출 규약레지스터와 호출 규약  Calling conventionCalling convention  The register preservation rule is that functions must preserve all registers,The register preservation rule is that functions must preserve all registers, except for eax, ecx, and edx, which can be changed across a function call,except for eax, ecx, and edx, which can be changed across a function call, and esp, which must be updated.and esp, which must be updated.  The function return rule is that the eax register receives function returnThe function return rule is that the eax register receives function return values if the result is 32 bits or smaller. If the result is 64 bits, then thevalues if the result is 32 bits or smaller. If the result is 64 bits, then the result is stored in the edx:eax pair.result is stored in the edx:eax pair.  Win32 (Stdcall) : Function parameters are passed on the stack, pushedWin32 (Stdcall) : Function parameters are passed on the stack, pushed right to left, and the callee cleans the stack.right to left, and the callee cleans the stack.  Native C++ (Thiscall) : Function parameters are passed on the stack,Native C++ (Thiscall) : Function parameters are passed on the stack, pushed right to left, the "this" pointer is passed in the ecx register, andpushed right to left, the "this" pointer is passed in the ecx register, and the callee cleans the stack.the callee cleans the stack.  COM(Stdcall for C++) : Function parameters are passed on the stack,COM(Stdcall for C++) : Function parameters are passed on the stack, pushed right to left, then the "this" pointer is pushed on the stack, andpushed right to left, then the "this" pointer is pushed on the stack, and then the function is called. The callee cleans the stack.then the function is called. The callee cleans the stack.  Fastcall : The first two DWORD-or-smaller arguments are passed in theFastcall : The first two DWORD-or-smaller arguments are passed in the ecx and edx registers. The remaining parameters are passed on theecx and edx registers. The remaining parameters are passed on the stack, pushed right to left. The callee cleans the stack.stack, pushed right to left. The callee cleans the stack.  Cdecl : Function parameters are passed on the stack, pushed right toCdecl : Function parameters are passed on the stack, pushed right to left, and the caller cleans the stack. The Cdecl calling convention isleft, and the caller cleans the stack. The Cdecl calling convention is used for all functions with variable-length parameters.used for all functions with variable-length parameters.
  • 26. 플래그와 조건플래그와 조건 ,, 데이터 형데이터 형 식식 E, Z : If zero (or comparison equal)E, Z : If zero (or comparison equal)  NE, NZ : If nonzero (or comparison unequal)NE, NZ : If nonzero (or comparison unequal)  GE : If greater than or equal to zeroGE : If greater than or equal to zero  LT, NGE : If less than zeroLT, NGE : If less than zero  GT : If greater than zeroGT : If greater than zero  LE, NGT : If less than zeroLE, NGT : If less than zero  C : If carryC : If carry  NC : If no carryNC : If no carry  AE, NB : If above or equal (unsigned greater)AE, NB : If above or equal (unsigned greater)  B, NAE : If below (unsigned less than)B, NAE : If below (unsigned less than)  A, NBE : If above (unsigned greater or equal)A, NBE : If above (unsigned greater or equal)  BE, NA : If below or equal (unsigned less thanBE, NA : If below or equal (unsigned less than or equal)or equal)
  • 27. x86x86 명령들명령들  LEA r, m : Load effective address.LEA r, m : Load effective address.  LEA eax, [esi+4] means eax = esi + 4.LEA eax, [esi+4] means eax = esi + 4.  MOV r1/m, r2/m/#n : r1/m = r/m/#nMOV r1/m, r2/m/#n : r1/m = r/m/#n  PUSH r/m/#n : Push value onto stack.PUSH r/m/#n : Push value onto stack.  POP r/m : Pop value from stack.POP r/m : Pop value from stack.  LEAVE : Tear down stack frameLEAVE : Tear down stack frame  mov esp, ebpmov esp, ebp  pop ebppop ebp  ADD, SUB, NEG, INC, DEC, CMP, MUL, IMUL, DIV,ADD, SUB, NEG, INC, DEC, CMP, MUL, IMUL, DIV, IDIVIDIV  AND, OR, XOR, NOT, TEST, SHL, SHR, SAR(sign-fill)AND, OR, XOR, NOT, TEST, SHL, SHR, SAR(sign-fill)  JMP, CALL, RETJMP, CALL, RET  NOP (0x90), INT 3 (0xCC)NOP (0x90), INT 3 (0xCC)
  • 29. © 2004 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary.

Notes de l'éditeur

  1. <number>
  2. <number>
  3. <number>
  4. <number>