SlideShare a Scribd company logo
1 of 45
Download to read offline
DEBUGGING?
Lusain. Kim
디버깅이란?
디버깅이란?
 디버깅 : 프로그램에 버그가 발생했을 때 이것을 잡는 행위
 버그 : 프로그램 실행 중 예기치 않은 오류가 발생한 상황
 컴파일 에러 : 여기서 설명하지 않습니다. 파이팅!
 런타임 에러 : 이제부터 설명 할게요.
Hello, Debugging
알고 쓰셨어요?Visual Studio에서 제공하는 디버깅 방법
디버깅의 기초 : 들어가기 전에
 디버깅은 항상 ‘Debug’ 상태에서 작업!
 ‘Release’ 상태에서는 코드 최적화를 하기 때문에 정상적인 디버깅이 어렵다!
 ‘Release’ 상태에서 디버깅 하는 방법 : LOG 띄우기, 문자열 출력…
 디버깅은Visual Studio에서 하고 끝이 아니다!
 개발 환경에서는 발생하지 않는 문제가 존재할 수 있음
 따라서 배포 환경에서의 테스트는 필수불가결
 Visual Studio 재배포 패키지가 설치되지 않은 환경은 프로그램의 정상 동작을 보장 못함!
 배포하기 전에 여러 환경에서 프로그램을 테스트 하는 것이 중요!
디버깅의 기초 : 중단
 프로그램을 디버깅할 때 이런 문제가 발생할 경우,
(Press Retry to debug the application)
을 눌러 디버깅해야 원인을 알 수 있음.

디버깅의 기초 : 호출 스택
 디버깅 중인 프로그램을 일시 중지했을 때 어떤 경로로 중단된 위치까지 코드
가 실행됐는지 확인할 수 있는 매우 유용한 창
 아래 호출 스택의 경우,WinMain > CGameFramework::FrameAdvance
> CGameFramework:: AnimateObject >MainStage::AnimateObject
형태로 접근한 상태.
 더블 클릭으로 해당 스택으로 이동 가능. 이동한 위치의 변수 값도 확인 가능.
디버깅의 기초 : 중단점
중단점(F9)
 빨간 원 형태로 표시. 해당 위치를 클릭하여 생성/ 해제 가능
 오른쪽 스크롤 바에 갈색으로 표시
 디버깅(F5) 중 중단점이 찍힌 위치에서 일시정지
 중단점에 의한 일시정지는 별도의 조작이 없다면 해당 줄 시작 직전.
(바로 직전 줄까지 실행된 상태)
디버깅의 기초 : 중단점++
 [디버그(D) > 창(W) > 중단점(B)] 를 통해 중단점 일괄 관리가 가능
 중단점 창에서 할 수 있는 일 :
 중단점 새로 만들기
 비활성화
 중단점 삭제
 중단 조건 입력 : 조건이 참인 경우와 값이 변경된 경우 중단.
 단, 중단 조건은 연산자 오퍼레이터를 지원하지 않음
+ Tip )
디버깅의 기초 : 중단점++
 중단점 창에서 할 수 있는 일(계속) :
 적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.
 적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.
디버깅의 기초 : 중단점++
 중단점 창에서 할 수 있는 일(계속) :
 적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.
 적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.
 필터 : 적중되는 코드의 호출 위치에 따라 중단 여부 결정.
디버깅의 기초 : 중단점++
 중단점 창에서 할 수 있는 일(계속) :
 적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.
 적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.
 필터 : 적중되는 코드의 호출 위치에 따라 중단 여부 결정.
 위치 : 중단될 줄과 문자(몇 번째 문자에서 멈출지) 설정.
디버깅의 기초 : 중단점++
 중단점 창에서 할 수 있는 일(계속) :
 적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.
 적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.
 필터 : 적중되는 코드의 호출 위치에 따라 중단 여부 결정.
 위치 : 중단될 줄과 문자(몇 번째 문자에서 멈출지) 설정.
 Visual Studio 2015에서는 더욱 발전된 형태로 제공
디버깅의 기초 : 지금 얘 값이 어떻게 되지?
 [디버그(D) > 창(W) > 자동(A), 지역(L), 조사식(W)] 등을 통해 확인 가능
※ 디버깅 중이 아닐 경우 표시되지 않음!
 중단 중인 위치에서의 객체 또는 변수의 상태를 알 수 있음.
 자동 : 코드의 현재 줄과 이전 줄에 사용된 변수를 알아서 잘 표시.
 지역 : 현재 범위의 지역 변수를 표시. 가장 기본적으로 사용하는 상태.
 조사식 : 원하는 값을 ‘이름’ 필드에 입력하여 값을 확인 가능. 전역 값 확인에 유용.
 디버깅할 때 가장 많이 들여다 볼 창
 디버깅을 할 때, 진입점(entry point, 대체로 main())부터 한 줄씩 실행이 가능!
 F11 : 한 단계씩 코드 실행
 F10 : 프로시저 단위 실행
 Shift + F11 : 프로시저 나가기
 Alt + Num *(NumPad의 * 키) : 다음 문(현재 커서 위치) 표시
 Ctrl + F10 : 텍스트 편집 중 현재 캐럿이 위치한 줄까지 디버깅 후 일시 정지
현재 커서 위치
Visual Studio 2015에서는 일시 중지부터
다음 일시 중지 시점까지의 경과 시간 표시.
디버깅의 기초 : 한 줄씩 볼래요!
 가끔, 현재까지 실행된 상태로 몇 줄 전의 코드를 실행하면 어떻게 되는지 확인해야
할 경우가 존재
 현재 커서 위치 아이콘( )을 실행을 원하는 줄로 드래그하여 계속 디버깅
 사용 목적 :
 해당 디버깅에 원하지 않는 실행 구문을 건너뛸 때 코드를 건들지 않는 방법
 커서를 변경시킬 경우, 예기치 않은 오류가 일어날 가능성이 매우 높음.
 제한적으로 사용해야 함 : 다시 실행하거나, 건너뛰어도 실행에 문제 없는가? 확인
 아무래도 쓰는 걸 권장하지는 않음
디버깅의 기초 : 싫어! 내가 직접 바꿀 거야!
 디버깅 중, 값 변경이 필요할 때가 존재
 변수 창의 값 필드 중 변경하고 싶은 값을 더블 클릭
 변경 완료!
 이 역시 예기치 않은 문제를 일으킬 가능성이 존재
 값을 변경해도 코드에 문제가 없는지 확인
디버깅의 기초 : 싫어! 내가 직접 바꿀 거야!
 자주 사용/변경하는 값은 변수 창에서 보는 것보다 텍스트 편집기의 코드 위에
고정해서 보는 게 효율적
 DataTips : 마우스 커서를 고정할 변수 위에 가만히 두면
처럼 변수와 현재 값이 간략하게 표시.
버튼을 눌러 고정하면 끝.
- 이동 가능
- 변수에 대한 메모 가능
- 디버깅 종료 후 마지막 값 저장
디버깅의 기초 : 두고두고 확인합시다.
 배포 테스트를 위해 일반적인 방법으로 프로그램 실행 중에 버그를 발견했을 때
 [디버그(D) > 프로세스에 연결(P)] 로 실행 파일과Visual Studio를 연결
※ 단, 실행 프로그램이 소스코드
와 동일한 버전이어야만 가능.
심화 : 실행중인 프로그램을 디버깅해보자!
 코드 분석 : 컴파일러가 코드를 분석해서 문제가 있을법한 부분들을 조목조목 알림
못된 것들 너무 깐깐해
 프로그래머가 흑마법 기교를 부려 작성한
부분도 다 잡음.
 해당 문제들 대부분을 고치는 것을 추천
 [분석(N)>솔루션에서 코드 분석 실행(Y)]
심화 : 코드 분석은 하고 코딩하세요?
 진단 도구 :Visual Studio의 꽃.
 진단 목적에 따라 CPU 사용량,GPU 사용 현황
메모리 사용량, 성능 마법사 등을 사용.
 진단 시작 후 프로그램 실행부터 종료까지 진단, 보고서 작성에 몇 분의 시간이 소요
 필요할 때 적절한 진단 도구를 이용하여 프로그램의 디버깅 시간을 효과적으로 단축
 자세한 사항은 다음 링크를 참조
심화 : 진단 도구 활용해 보기.
https://msdn.microsoft.com/ko-kr/library/dd264943.aspx
 프로파일링 보고서 예시. 실행 부하 과다 경로, 개별 작업이 가장 많은 함수 등을 표시,
언제 CPU를 가장 많이 사용하였는지 표시.
심화 : 프로파일러
 Visual Studio 2015의 경우, 디버깅 시 자동으로 진단 시작
 CPU와 메모리에 대해서 진단
 프로파일러를 사용하기 위해서는
디버그(D) > 프로파일러 > 성능 탐색기(E) > 새 성능 세션
성능 탐색기 > 대상 > 대상 프로젝트 추가(P) > 프로파일링하기 위한 프로젝트 추가
프로파일링 시작
 많이 호출되는 함수에서 고칠 점은 없는지 확인 할 수 있음.
심화 : 진단 도구 활용해 보기.
Code Level Debugging
이런 건 알고 디버깅 하시나요?
디버깅의 기초 : 범위 위반
 범위 위반 : 할당된 영역을 벗어나 할당되지 않은 위치를 접근하려고 할 때 발생
 Segment Fault : OS에서 할당한 프로그램 데이터 범위 밖으로 접근할 때 발생
 둘 모두 정상적인 접근 범위 밖을 접근하려고 할 때 발생!
 해결법 :
1. 접근 전 항상 정상적인 접근 범위 이내인지 확인
 코드 발적화의 지름길
2. 중단점을 이용하여 범위 위반 시 프로그램 일시 중지
디버깅의 기초 : 범위 확인
 for(size_t idx = 10; idx >= 0; --idx) { } 는 오류가 나는 구문.
 왜?
→ size_t는 unsigned int의 typedef형.
→ idx >= 0은 underflow로 인하여 항상 true.
→ 무한 루프 및 오류 발생!
디버깅의 기초 : is this nullptr?
 클래스 사용 중 도저히 나올 수 없는 기괴한 값이 나올 경우가 존재
 대부분 변수 확인 시 this 값이 nullptr 또는 0xcdcdcdcd 같은 값이 들어가 있음.
 둘 모두 잘못된 코딩이 1차적 문제 똑바로 코딩하세요! 컴파일러 불쌍해…
 nullptr 은 확인이 그나마 간단. nullptr 로 초기화 해준 뒤 최초 참조 라는 뜻.
 0xcdcdcdcd : 힙 영역에 올릴 데이터가 초기화도 안 해놓은 상태인데 할당
해야 할 경우 Visual Studio에서 임시로 할당한 값.
+0xcccccccc : 지역 변수를 초기화하지 않고 할당할 경우 나오는 값.
→ 할당 문제. 이 문제들이 발생했다는 것은 할당이 제대로 이루어지 않아 정
상적인 값이 할당되지 않았다는 것.
디버깅의 기초 : if는 값을 넣는다.
 값 비교를 통해 if문을 사용할 때 == 와 = 을 주의하라는 건 매우 기초적.
 bool 형 변수들은 그 자체로도 true와 false를 가지므로 == true 또는 == false 는
불필요한 연산.
 bool 형을 반환형으로 가지는 함수도 if 문 안에 넣을 수 있음.
 단항 논리 연산자 중 ! 는 비트를 반대로( 1→0, 0→1) 하는 역할
 bool bTrueFalse = false; if(!bTrueFalse){ /*동작*/ }
 !변수명 은 파악하기 어려움 → ! 변수명 처럼 변수, 함수명과 띄어 표시.
 또한, 헷갈리지 않는 코딩용 폰트로 코딩
유지보수하기 어렵게 코딩하기 : if의 신묘함
 논리 연산 &&는 왼쪽 피연산자부터 연산, 하나라도 false 값이 나올 경우 false
값 반환.
 이를 이용하여 if문을 다음과 같이 사용할 수 있음.
 이 경우 어느 부분에서 false 값이 나타났는지 모름.
 코드를 몇 줄 줄이다가 디버깅을 몇 시간 할 수 있음.
 항상 올바르게 동작하는 코드가 아니라면 이런 방식으로 코딩하면 안 됨!
 전처리기 : 컴파일 타임에 이미 처리된 문장.
 전처리기를 이용하여 소스 코드를 여러 파일로 분할 가능(#include)
 전처리기는 문장의 공백을 제외한 첫 번째 문자로 #이 위치해야 함.
 전처리기는 다음 등이 있음 : #include, #define, #pragma, #ifdef, #using…
 전처리기에 대한 이야기가 아니기 때문에 자세한 내용 생략
 참고 자료 : https://msdn.microsoft.com/ko-kr/library/wy090hkc.aspx
 이제부터 살펴볼 연산자는 #define, #if 문.
전처리기는 쓰고 코딩하세요?
 ANSI와 호환되는 기본적으로 정의된 매크로
 _ _ FILE_ _ : 현재 소스 파일의 이름을 반환
 [프로젝트 속성 > C/C++ > 고급 > 전체 경로 사용] 으로 반환 값을 전체 경로로 변경 가능
 _ _ LINE__ : 매크로를 호출한 위치를 문자열로 반환.
 Visual Studio에서 기본적으로 정의해 놓은 매크로
 _DEBUG : Debug로 컴파일 시 기본 정의
 NDEBUG : Release로 컴파일 시 기본 정의
 _ _ FUNCTION__ : 함수 내에서 사용 가능하며, 호출된 지역의 함수 명을 반환
 기본 제공하는 매크로를 이용하여 어느 부분에서 오류가 났는지 로그 파일을
작성할 수 있음
전처리기 기본 : 기본 정의 매크로
 #define : 컴파일 타임에 정의된 위치의 모든 단어를 내용으로 변경.
 단순 치환이기 때문에 오류 발생 가능성 존재
 또한, 단순 치환이기 때문에 매우 간단한 함수를 대체하기도 함.
 C++에서는 inline 함수가 있기 때문에 #define 함수는 지양하는 것이 좋음.
 단순히 #define ~~만 해도 동작. 이 경우 #define 은 정의된 것 이외의 역할은 하지 않음.
 ex)
 #define MyDefine 1
 #define MyDefFunc(x) (x – 10)
 사용 방법
 #define USE_AUDIO // 오디오 기능을 사용.
 #define SET_DEBUG_LEVEL 3 // 코드에서 만들어 둔 디버그 단계 중 3단계를 사용
전처리기 기본 : #define
 #define 은 #define 하나가 아닌 #if 문과 같이 사용하여야 효과가 증대
 #if, #ifdef, #ifndef 등을 통해 컴파일 타임에서 코드 제어가 가능
 #if~ 전처리기는 #else 또는 #elif로 해당 경우가 아닐 경우의 코드를 작성 가능
 #if~ 전처리기는 #endif 를 사용하여 닫아야 함.
 #ifdef : #define 으로 정의된 단어만 사용 가능
 #elif : #else #if 와 동일한 개념. 훨씬 간편.
 #else 는 #if ~~ 와 #endif 사이 단 한번만 사용 가능
전처리기 기본 : #if~~
ex)
 #ifdef 로 생성될 프로그램에 디버깅 관련 코드를 생성하지 않게 만들 수 있음
 Debug 모드로 생성한 프로그램에서는 존재하지만 Release 모드로 생성한 프로그램
에는 존재하지 않는 코드를 구현 가능 → 배포 시 코드 수정이 편리
 #undef ~~: 현재 줄 부터 정의된 단어 ~~를 정의 해제함.
※ 단, 프로그램 실행 흐름과 무관하게 소스 코드의 줄로만 판단.
 사용처 : 디버깅이 필요하지 않은 부분에서는 디버깅을 하지 않을 수 있음.
 함수에서 임시 정의를 내려 정의 해제할 정의 값을 알고 있는 상태에서
정의 해제 후 동작한 뒤 다시 정의 내리는 방법도 가능.
 추가 : 토큰 붙여 넣기 연산자
 별도의 토큰이 단일 토큰으로 병합되도록 허용
 #define MERGETOKEN(x, y) x##y → xy 로 인식.
전처리기 활용 : #define 심화
 #if 를 이용하여 #include 여부도 설정이 가능
 디버깅을 위한 모듈을 헤더 파일에 둔 뒤 그걸 #include 하는 방식으로 코딩할 수 있음.
 Release 생성 프로그램의 경량화 및 최적화에 도움
 #pragma comment (lib, LIBRARYNAME) 형식으로 디버깅에 필요한 DLL을 추가 가능
 #if로 Release 모드에서 추가하지 않을 수 있음.
전처리기 활용 : #if~~ 심화
ex)
+ #if문 활용 편(2)
 중단점을 이용하여 프로그램을 일시 중지할 수 있지만 협업 시 중단점 위치에
주석 등의 메모를 남기기는 애매한 부분이 존재.
 중단점은 프로젝트에 종속되기 때문에 소스 코드를 Copy & Paste 할 경우 소실.
 이럴 때 쓰는 방법 : assert, _DEBUG_ERROR()
중단하는 프로그래밍
 필요한 헤더 파일 : #include <assert.h> (C++ 헤더 규칙으로는 #include <cassert>)
 사용 방법 : assert(조건문);
true 이면 생략, false 이면 발생.
 조건문이 실패할 경우 다음과 같은 오류 창 출력
 [Assertion failed : 조건문, 파일 경로, 오류 줄 수]
형태로 출력
 assert는 작동하면 무조건 프로그램을 종료.
중단하는 프로그래밍 : assert
 필요한 헤더 파일 : #include <xutility> (내장됨 : #include <iostream>)
 사용 방법 : _DEBUG_ERROR();
항상 실행.
 조건문이 실패할 경우 다음과 같은 오류 창 출력
 항상 실행하기 때문에 if문으로 조건문을 처리해야 함.
 _DEBUG_ERROR()는 프로그램을 종료하지 않고 경고.
중단하는 프로그래밍 : _DEBUG_ERROR
 Release 모드는 코드 최적화로 인하여 Debug 모드에서는 발생하지 않던 문제
가 발생할 수 있음.
 이 경우, Debug의 안전 장치 안에서만 정상 동작했기 때문에 좋은 코드가 아님.
 Release 모드에서는 값 확인이 제대로 안 됨
 중단점 찍어서 디버깅하기는 무리
 정답은 이미 나옴
 콘솔에 찍기
 출력에 LOG로 남기기
 LOG용 텍스트 파일에 LOG 남기기
 문자열로 박제
Release 모드도 디버깅이 하고 싶어!
 Windows Program의 경우 디버깅 로그를 위한 콘솔이 매우 편리할 수 있음.
 AllocConsole() 함수를 이용하여 콘솔 생성 가능.
freopen("CONIN$", "rb", stdin);
freopen("CONOUT$", "wb", stdout);
freopen("CONOUT$", "wb", stderr);
//cout, cin, cerr 사용을 위해서는 아래 구문을 추가
std::ios::sync_with_stdio();
 프로그램 종료 시 FreeConsole() 함수를 호출하여 콘솔 종료
 ※Visual Studi0 2013 이후 버전에서는 오류가 발생
 [프로젝트 속성 > C/C++ > 전처리기 > 전처리기 정의] 에서 _CRT_SECURE_NO_WARNINGS 를 추가.
 ※ cout 또는 wcout 사용 시 locale 설정을 해야 정상적으로 출력됨.
Release 모드의 디버깅 : 콘솔에 찍기
 Windows 기반 프로그램에서는 다음 함수로 로그를 기록
OutputDebugString(str)
 디버깅 중 또는 디버깅이 끝날 때 확인.
 확인 방법
 [디버그(D) > 창(W) > 출력(O)] 를 통해 출력 창 실행
 출력 보기 선택을 ‘디버그’ 로 변경
 확인
 C#, JS에 대한 로그 남기는 방법은 다음 웹 사이트 참고.
Release 모드의 디버깅 : 출력 창에 로그 기록
 전역에서 접근 가능한 파일을 생성
 또는 싱글톤으로 프로젝트 내에서 접근 가능하도록 구현
 해당 예제는 Debug 모드일 때에만 가능하도록 했지만
_DEBUG 를 지우면 Release 모드에서도 사용 가능
 로그를 남기는 것을 원하지 않으면
#define _USE_DEBUG_OUTPUT_TEXT를 주석처리
 원하는 대로 개조해서 사용
 샘플 코드는 다음 링크 참고.
 https://gist.github.com/LusainKim/dc3eb19bc51b1322a518
Release 모드의 디버깅 : 파일에 로그 남기기
 디버깅을 위한 문자열 선언
 sprintf, wsprintf 등의 함수를 이용해
확인을 원하는 값을 문자열에 입력
 문자열로 확인
Release 모드의 디버깅 : 문자열 박제
Thank you!
열심히 코딩하세요!
참고 문헌
 중단점 창 : https://msdn.microsoft.com/ko-kr/library/aa290723(v=vs.71).aspx
 조사식 : https://msdn.microsoft.com/ko-kr/library/4dt5w8ta.aspx
 직접 실행 창 : https://msdn.microsoft.com/ko-kr/library/f177hahy.aspx
 매크로 : https://msdn.microsoft.com/ko-kr/library/b0084kay.aspx
 디버그 출력 : https://t.co/00absV1SnZ
 당신의 프로그래밍에 디버깅 더하기 Visual C++ 디버깅 기초에서 고급까지
최홍배 著 (한빛 미디어, 2014, ISBN : 978-89-6848-658-6 15000/비매품)
 Debug It! 실용주의 디버깅
폴 부처 著, 박일 譯 (에이콘, 2010, ISBN : 978-89-6077-1413)
 유지보수하기 어렵게 코딩하기(모방을 방지하기 위하여 이하 생략)

More Related Content

What's hot

大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらと大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらとToshinori Sato
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解MITSUNARI Shigeo
 
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
3週連続DDDその2  深いモデルの探求(ドメイン駆動設計 第3部)3週連続DDDその2  深いモデルの探求(ドメイン駆動設計 第3部)
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)増田 亨
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニックGenya Murakami
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がりMITSUNARI Shigeo
 
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Inc.
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門Hideyuki Tanaka
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼうxenophobia__
 
SIMDで整数除算
SIMDで整数除算SIMDで整数除算
SIMDで整数除算shobomaru
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!amusementcreators
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説murachue
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門Toru Matsuoka
 
単語・句の分散表現の学習
単語・句の分散表現の学習単語・句の分散表現の学習
単語・句の分散表現の学習Naoaki Okazaki
 

What's hot (20)

大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらと大学3年生の僕に伝えたいことをつらつらと
大学3年生の僕に伝えたいことをつらつらと
 
AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解AVX-512(フォーマット)詳解
AVX-512(フォーマット)詳解
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
3週連続DDDその2  深いモデルの探求(ドメイン駆動設計 第3部)3週連続DDDその2  深いモデルの探求(ドメイン駆動設計 第3部)
3週連続DDDその2 深いモデルの探求(ドメイン駆動設計 第3部)
 
Constexpr 中3女子テクニック
Constexpr 中3女子テクニックConstexpr 中3女子テクニック
Constexpr 中3女子テクニック
 
暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり暗号化したまま計算できる暗号技術とOSS開発による広がり
暗号化したまま計算できる暗号技術とOSS開発による広がり
 
人工知能概論 11
人工知能概論 11人工知能概論 11
人工知能概論 11
 
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼう
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
SIMDで整数除算
SIMDで整数除算SIMDで整数除算
SIMDで整数除算
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 
コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!コルーチンでC++でも楽々ゲーム作成!
コルーチンでC++でも楽々ゲーム作成!
 
指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
目grep入門 +解説
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門
 
単語・句の分散表現の学習
単語・句の分散表現の学習単語・句の分散表現の学習
単語・句の分散表現の学習
 

Similar to 당신의 디버깅에 니코니코니

Debugging with Visual Studio
Debugging with Visual StudioDebugging with Visual Studio
Debugging with Visual StudioLusain Kim
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++KyeongWon Koo
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
Windows Debugging Technique #3
Windows Debugging Technique #3Windows Debugging Technique #3
Windows Debugging Technique #3Wooseok Seo
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어NAVER D2
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2Wooseok Seo
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기jaypi Ko
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기jaypi Ko
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)Jay Park
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
디버거 소개
디버거 소개디버거 소개
디버거 소개JuHong Jeong
 
01 에러핸들링(함송연)
01 에러핸들링(함송연)01 에러핸들링(함송연)
01 에러핸들링(함송연)ssuser3fb17c
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1Chris Ohk
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swiftNAVER D2
 
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은Sung Eun Kim
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법성훈 김
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기Seungjae Lee
 

Similar to 당신의 디버깅에 니코니코니 (20)

Debugging with Visual Studio
Debugging with Visual StudioDebugging with Visual Studio
Debugging with Visual Studio
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
Windows Debugging Technique #3
Windows Debugging Technique #3Windows Debugging Technique #3
Windows Debugging Technique #3
 
[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어[1B1]스위프트프로그래밍언어
[1B1]스위프트프로그래밍언어
 
Windows Debugging Technique #2
Windows Debugging Technique #2Windows Debugging Technique #2
Windows Debugging Technique #2
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
 
C언어 들어가기
C언어 들어가기C언어 들어가기
C언어 들어가기
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
디버거 소개
디버거 소개디버거 소개
디버거 소개
 
01 에러핸들링(함송연)
01 에러핸들링(함송연)01 에러핸들링(함송연)
01 에러핸들링(함송연)
 
2013 C++ Study For Students #1
2013 C++ Study For Students #12013 C++ Study For Students #1
2013 C++ Study For Students #1
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
 
[Osxdev]4.swift
[Osxdev]4.swift[Osxdev]4.swift
[Osxdev]4.swift
 
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
NDC 2017 라이브 프로세스 분석을 통한 효율적인 게임 로직 개발 - 김성은
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
 
온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기온라인 게임 처음부터 끝까지 동적언어로 만들기
온라인 게임 처음부터 끝까지 동적언어로 만들기
 

당신의 디버깅에 니코니코니

  • 3. 디버깅이란?  디버깅 : 프로그램에 버그가 발생했을 때 이것을 잡는 행위  버그 : 프로그램 실행 중 예기치 않은 오류가 발생한 상황  컴파일 에러 : 여기서 설명하지 않습니다. 파이팅!  런타임 에러 : 이제부터 설명 할게요.
  • 4. Hello, Debugging 알고 쓰셨어요?Visual Studio에서 제공하는 디버깅 방법
  • 5. 디버깅의 기초 : 들어가기 전에  디버깅은 항상 ‘Debug’ 상태에서 작업!  ‘Release’ 상태에서는 코드 최적화를 하기 때문에 정상적인 디버깅이 어렵다!  ‘Release’ 상태에서 디버깅 하는 방법 : LOG 띄우기, 문자열 출력…  디버깅은Visual Studio에서 하고 끝이 아니다!  개발 환경에서는 발생하지 않는 문제가 존재할 수 있음  따라서 배포 환경에서의 테스트는 필수불가결  Visual Studio 재배포 패키지가 설치되지 않은 환경은 프로그램의 정상 동작을 보장 못함!  배포하기 전에 여러 환경에서 프로그램을 테스트 하는 것이 중요!
  • 6. 디버깅의 기초 : 중단  프로그램을 디버깅할 때 이런 문제가 발생할 경우, (Press Retry to debug the application) 을 눌러 디버깅해야 원인을 알 수 있음. 
  • 7. 디버깅의 기초 : 호출 스택  디버깅 중인 프로그램을 일시 중지했을 때 어떤 경로로 중단된 위치까지 코드 가 실행됐는지 확인할 수 있는 매우 유용한 창  아래 호출 스택의 경우,WinMain > CGameFramework::FrameAdvance > CGameFramework:: AnimateObject >MainStage::AnimateObject 형태로 접근한 상태.  더블 클릭으로 해당 스택으로 이동 가능. 이동한 위치의 변수 값도 확인 가능.
  • 8. 디버깅의 기초 : 중단점 중단점(F9)  빨간 원 형태로 표시. 해당 위치를 클릭하여 생성/ 해제 가능  오른쪽 스크롤 바에 갈색으로 표시  디버깅(F5) 중 중단점이 찍힌 위치에서 일시정지  중단점에 의한 일시정지는 별도의 조작이 없다면 해당 줄 시작 직전. (바로 직전 줄까지 실행된 상태)
  • 9. 디버깅의 기초 : 중단점++  [디버그(D) > 창(W) > 중단점(B)] 를 통해 중단점 일괄 관리가 가능  중단점 창에서 할 수 있는 일 :  중단점 새로 만들기  비활성화  중단점 삭제  중단 조건 입력 : 조건이 참인 경우와 값이 변경된 경우 중단.  단, 중단 조건은 연산자 오퍼레이터를 지원하지 않음 + Tip )
  • 10. 디버깅의 기초 : 중단점++  중단점 창에서 할 수 있는 일(계속) :  적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.  적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.
  • 11. 디버깅의 기초 : 중단점++  중단점 창에서 할 수 있는 일(계속) :  적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.  적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.  필터 : 적중되는 코드의 호출 위치에 따라 중단 여부 결정.
  • 12. 디버깅의 기초 : 중단점++  중단점 창에서 할 수 있는 일(계속) :  적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.  적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.  필터 : 적중되는 코드의 호출 위치에 따라 중단 여부 결정.  위치 : 중단될 줄과 문자(몇 번째 문자에서 멈출지) 설정.
  • 13. 디버깅의 기초 : 중단점++  중단점 창에서 할 수 있는 일(계속) :  적중 횟수에 따른 처리 : 중단점의 실행 횟수에 따라 중단 가능.  적중될 때 계속 실행하되 출력 창에 메시지 표시 가능.  필터 : 적중되는 코드의 호출 위치에 따라 중단 여부 결정.  위치 : 중단될 줄과 문자(몇 번째 문자에서 멈출지) 설정.  Visual Studio 2015에서는 더욱 발전된 형태로 제공
  • 14. 디버깅의 기초 : 지금 얘 값이 어떻게 되지?  [디버그(D) > 창(W) > 자동(A), 지역(L), 조사식(W)] 등을 통해 확인 가능 ※ 디버깅 중이 아닐 경우 표시되지 않음!  중단 중인 위치에서의 객체 또는 변수의 상태를 알 수 있음.  자동 : 코드의 현재 줄과 이전 줄에 사용된 변수를 알아서 잘 표시.  지역 : 현재 범위의 지역 변수를 표시. 가장 기본적으로 사용하는 상태.  조사식 : 원하는 값을 ‘이름’ 필드에 입력하여 값을 확인 가능. 전역 값 확인에 유용.  디버깅할 때 가장 많이 들여다 볼 창
  • 15.  디버깅을 할 때, 진입점(entry point, 대체로 main())부터 한 줄씩 실행이 가능!  F11 : 한 단계씩 코드 실행  F10 : 프로시저 단위 실행  Shift + F11 : 프로시저 나가기  Alt + Num *(NumPad의 * 키) : 다음 문(현재 커서 위치) 표시  Ctrl + F10 : 텍스트 편집 중 현재 캐럿이 위치한 줄까지 디버깅 후 일시 정지 현재 커서 위치 Visual Studio 2015에서는 일시 중지부터 다음 일시 중지 시점까지의 경과 시간 표시. 디버깅의 기초 : 한 줄씩 볼래요!
  • 16.  가끔, 현재까지 실행된 상태로 몇 줄 전의 코드를 실행하면 어떻게 되는지 확인해야 할 경우가 존재  현재 커서 위치 아이콘( )을 실행을 원하는 줄로 드래그하여 계속 디버깅  사용 목적 :  해당 디버깅에 원하지 않는 실행 구문을 건너뛸 때 코드를 건들지 않는 방법  커서를 변경시킬 경우, 예기치 않은 오류가 일어날 가능성이 매우 높음.  제한적으로 사용해야 함 : 다시 실행하거나, 건너뛰어도 실행에 문제 없는가? 확인  아무래도 쓰는 걸 권장하지는 않음 디버깅의 기초 : 싫어! 내가 직접 바꿀 거야!
  • 17.  디버깅 중, 값 변경이 필요할 때가 존재  변수 창의 값 필드 중 변경하고 싶은 값을 더블 클릭  변경 완료!  이 역시 예기치 않은 문제를 일으킬 가능성이 존재  값을 변경해도 코드에 문제가 없는지 확인 디버깅의 기초 : 싫어! 내가 직접 바꿀 거야!
  • 18.  자주 사용/변경하는 값은 변수 창에서 보는 것보다 텍스트 편집기의 코드 위에 고정해서 보는 게 효율적  DataTips : 마우스 커서를 고정할 변수 위에 가만히 두면 처럼 변수와 현재 값이 간략하게 표시. 버튼을 눌러 고정하면 끝. - 이동 가능 - 변수에 대한 메모 가능 - 디버깅 종료 후 마지막 값 저장 디버깅의 기초 : 두고두고 확인합시다.
  • 19.  배포 테스트를 위해 일반적인 방법으로 프로그램 실행 중에 버그를 발견했을 때  [디버그(D) > 프로세스에 연결(P)] 로 실행 파일과Visual Studio를 연결 ※ 단, 실행 프로그램이 소스코드 와 동일한 버전이어야만 가능. 심화 : 실행중인 프로그램을 디버깅해보자!
  • 20.  코드 분석 : 컴파일러가 코드를 분석해서 문제가 있을법한 부분들을 조목조목 알림 못된 것들 너무 깐깐해  프로그래머가 흑마법 기교를 부려 작성한 부분도 다 잡음.  해당 문제들 대부분을 고치는 것을 추천  [분석(N)>솔루션에서 코드 분석 실행(Y)] 심화 : 코드 분석은 하고 코딩하세요?
  • 21.  진단 도구 :Visual Studio의 꽃.  진단 목적에 따라 CPU 사용량,GPU 사용 현황 메모리 사용량, 성능 마법사 등을 사용.  진단 시작 후 프로그램 실행부터 종료까지 진단, 보고서 작성에 몇 분의 시간이 소요  필요할 때 적절한 진단 도구를 이용하여 프로그램의 디버깅 시간을 효과적으로 단축  자세한 사항은 다음 링크를 참조 심화 : 진단 도구 활용해 보기. https://msdn.microsoft.com/ko-kr/library/dd264943.aspx
  • 22.  프로파일링 보고서 예시. 실행 부하 과다 경로, 개별 작업이 가장 많은 함수 등을 표시, 언제 CPU를 가장 많이 사용하였는지 표시. 심화 : 프로파일러
  • 23.  Visual Studio 2015의 경우, 디버깅 시 자동으로 진단 시작  CPU와 메모리에 대해서 진단  프로파일러를 사용하기 위해서는 디버그(D) > 프로파일러 > 성능 탐색기(E) > 새 성능 세션 성능 탐색기 > 대상 > 대상 프로젝트 추가(P) > 프로파일링하기 위한 프로젝트 추가 프로파일링 시작  많이 호출되는 함수에서 고칠 점은 없는지 확인 할 수 있음. 심화 : 진단 도구 활용해 보기.
  • 24. Code Level Debugging 이런 건 알고 디버깅 하시나요?
  • 25. 디버깅의 기초 : 범위 위반  범위 위반 : 할당된 영역을 벗어나 할당되지 않은 위치를 접근하려고 할 때 발생  Segment Fault : OS에서 할당한 프로그램 데이터 범위 밖으로 접근할 때 발생  둘 모두 정상적인 접근 범위 밖을 접근하려고 할 때 발생!  해결법 : 1. 접근 전 항상 정상적인 접근 범위 이내인지 확인  코드 발적화의 지름길 2. 중단점을 이용하여 범위 위반 시 프로그램 일시 중지
  • 26. 디버깅의 기초 : 범위 확인  for(size_t idx = 10; idx >= 0; --idx) { } 는 오류가 나는 구문.  왜? → size_t는 unsigned int의 typedef형. → idx >= 0은 underflow로 인하여 항상 true. → 무한 루프 및 오류 발생!
  • 27. 디버깅의 기초 : is this nullptr?  클래스 사용 중 도저히 나올 수 없는 기괴한 값이 나올 경우가 존재  대부분 변수 확인 시 this 값이 nullptr 또는 0xcdcdcdcd 같은 값이 들어가 있음.  둘 모두 잘못된 코딩이 1차적 문제 똑바로 코딩하세요! 컴파일러 불쌍해…  nullptr 은 확인이 그나마 간단. nullptr 로 초기화 해준 뒤 최초 참조 라는 뜻.  0xcdcdcdcd : 힙 영역에 올릴 데이터가 초기화도 안 해놓은 상태인데 할당 해야 할 경우 Visual Studio에서 임시로 할당한 값. +0xcccccccc : 지역 변수를 초기화하지 않고 할당할 경우 나오는 값. → 할당 문제. 이 문제들이 발생했다는 것은 할당이 제대로 이루어지 않아 정 상적인 값이 할당되지 않았다는 것.
  • 28. 디버깅의 기초 : if는 값을 넣는다.  값 비교를 통해 if문을 사용할 때 == 와 = 을 주의하라는 건 매우 기초적.  bool 형 변수들은 그 자체로도 true와 false를 가지므로 == true 또는 == false 는 불필요한 연산.  bool 형을 반환형으로 가지는 함수도 if 문 안에 넣을 수 있음.  단항 논리 연산자 중 ! 는 비트를 반대로( 1→0, 0→1) 하는 역할  bool bTrueFalse = false; if(!bTrueFalse){ /*동작*/ }  !변수명 은 파악하기 어려움 → ! 변수명 처럼 변수, 함수명과 띄어 표시.  또한, 헷갈리지 않는 코딩용 폰트로 코딩
  • 29. 유지보수하기 어렵게 코딩하기 : if의 신묘함  논리 연산 &&는 왼쪽 피연산자부터 연산, 하나라도 false 값이 나올 경우 false 값 반환.  이를 이용하여 if문을 다음과 같이 사용할 수 있음.  이 경우 어느 부분에서 false 값이 나타났는지 모름.  코드를 몇 줄 줄이다가 디버깅을 몇 시간 할 수 있음.  항상 올바르게 동작하는 코드가 아니라면 이런 방식으로 코딩하면 안 됨!
  • 30.  전처리기 : 컴파일 타임에 이미 처리된 문장.  전처리기를 이용하여 소스 코드를 여러 파일로 분할 가능(#include)  전처리기는 문장의 공백을 제외한 첫 번째 문자로 #이 위치해야 함.  전처리기는 다음 등이 있음 : #include, #define, #pragma, #ifdef, #using…  전처리기에 대한 이야기가 아니기 때문에 자세한 내용 생략  참고 자료 : https://msdn.microsoft.com/ko-kr/library/wy090hkc.aspx  이제부터 살펴볼 연산자는 #define, #if 문. 전처리기는 쓰고 코딩하세요?
  • 31.  ANSI와 호환되는 기본적으로 정의된 매크로  _ _ FILE_ _ : 현재 소스 파일의 이름을 반환  [프로젝트 속성 > C/C++ > 고급 > 전체 경로 사용] 으로 반환 값을 전체 경로로 변경 가능  _ _ LINE__ : 매크로를 호출한 위치를 문자열로 반환.  Visual Studio에서 기본적으로 정의해 놓은 매크로  _DEBUG : Debug로 컴파일 시 기본 정의  NDEBUG : Release로 컴파일 시 기본 정의  _ _ FUNCTION__ : 함수 내에서 사용 가능하며, 호출된 지역의 함수 명을 반환  기본 제공하는 매크로를 이용하여 어느 부분에서 오류가 났는지 로그 파일을 작성할 수 있음 전처리기 기본 : 기본 정의 매크로
  • 32.  #define : 컴파일 타임에 정의된 위치의 모든 단어를 내용으로 변경.  단순 치환이기 때문에 오류 발생 가능성 존재  또한, 단순 치환이기 때문에 매우 간단한 함수를 대체하기도 함.  C++에서는 inline 함수가 있기 때문에 #define 함수는 지양하는 것이 좋음.  단순히 #define ~~만 해도 동작. 이 경우 #define 은 정의된 것 이외의 역할은 하지 않음.  ex)  #define MyDefine 1  #define MyDefFunc(x) (x – 10)  사용 방법  #define USE_AUDIO // 오디오 기능을 사용.  #define SET_DEBUG_LEVEL 3 // 코드에서 만들어 둔 디버그 단계 중 3단계를 사용 전처리기 기본 : #define
  • 33.  #define 은 #define 하나가 아닌 #if 문과 같이 사용하여야 효과가 증대  #if, #ifdef, #ifndef 등을 통해 컴파일 타임에서 코드 제어가 가능  #if~ 전처리기는 #else 또는 #elif로 해당 경우가 아닐 경우의 코드를 작성 가능  #if~ 전처리기는 #endif 를 사용하여 닫아야 함.  #ifdef : #define 으로 정의된 단어만 사용 가능  #elif : #else #if 와 동일한 개념. 훨씬 간편.  #else 는 #if ~~ 와 #endif 사이 단 한번만 사용 가능 전처리기 기본 : #if~~ ex)
  • 34.  #ifdef 로 생성될 프로그램에 디버깅 관련 코드를 생성하지 않게 만들 수 있음  Debug 모드로 생성한 프로그램에서는 존재하지만 Release 모드로 생성한 프로그램 에는 존재하지 않는 코드를 구현 가능 → 배포 시 코드 수정이 편리  #undef ~~: 현재 줄 부터 정의된 단어 ~~를 정의 해제함. ※ 단, 프로그램 실행 흐름과 무관하게 소스 코드의 줄로만 판단.  사용처 : 디버깅이 필요하지 않은 부분에서는 디버깅을 하지 않을 수 있음.  함수에서 임시 정의를 내려 정의 해제할 정의 값을 알고 있는 상태에서 정의 해제 후 동작한 뒤 다시 정의 내리는 방법도 가능.  추가 : 토큰 붙여 넣기 연산자  별도의 토큰이 단일 토큰으로 병합되도록 허용  #define MERGETOKEN(x, y) x##y → xy 로 인식. 전처리기 활용 : #define 심화
  • 35.  #if 를 이용하여 #include 여부도 설정이 가능  디버깅을 위한 모듈을 헤더 파일에 둔 뒤 그걸 #include 하는 방식으로 코딩할 수 있음.  Release 생성 프로그램의 경량화 및 최적화에 도움  #pragma comment (lib, LIBRARYNAME) 형식으로 디버깅에 필요한 DLL을 추가 가능  #if로 Release 모드에서 추가하지 않을 수 있음. 전처리기 활용 : #if~~ 심화 ex) + #if문 활용 편(2)
  • 36.  중단점을 이용하여 프로그램을 일시 중지할 수 있지만 협업 시 중단점 위치에 주석 등의 메모를 남기기는 애매한 부분이 존재.  중단점은 프로젝트에 종속되기 때문에 소스 코드를 Copy & Paste 할 경우 소실.  이럴 때 쓰는 방법 : assert, _DEBUG_ERROR() 중단하는 프로그래밍
  • 37.  필요한 헤더 파일 : #include <assert.h> (C++ 헤더 규칙으로는 #include <cassert>)  사용 방법 : assert(조건문); true 이면 생략, false 이면 발생.  조건문이 실패할 경우 다음과 같은 오류 창 출력  [Assertion failed : 조건문, 파일 경로, 오류 줄 수] 형태로 출력  assert는 작동하면 무조건 프로그램을 종료. 중단하는 프로그래밍 : assert
  • 38.  필요한 헤더 파일 : #include <xutility> (내장됨 : #include <iostream>)  사용 방법 : _DEBUG_ERROR(); 항상 실행.  조건문이 실패할 경우 다음과 같은 오류 창 출력  항상 실행하기 때문에 if문으로 조건문을 처리해야 함.  _DEBUG_ERROR()는 프로그램을 종료하지 않고 경고. 중단하는 프로그래밍 : _DEBUG_ERROR
  • 39.  Release 모드는 코드 최적화로 인하여 Debug 모드에서는 발생하지 않던 문제 가 발생할 수 있음.  이 경우, Debug의 안전 장치 안에서만 정상 동작했기 때문에 좋은 코드가 아님.  Release 모드에서는 값 확인이 제대로 안 됨  중단점 찍어서 디버깅하기는 무리  정답은 이미 나옴  콘솔에 찍기  출력에 LOG로 남기기  LOG용 텍스트 파일에 LOG 남기기  문자열로 박제 Release 모드도 디버깅이 하고 싶어!
  • 40.  Windows Program의 경우 디버깅 로그를 위한 콘솔이 매우 편리할 수 있음.  AllocConsole() 함수를 이용하여 콘솔 생성 가능. freopen("CONIN$", "rb", stdin); freopen("CONOUT$", "wb", stdout); freopen("CONOUT$", "wb", stderr); //cout, cin, cerr 사용을 위해서는 아래 구문을 추가 std::ios::sync_with_stdio();  프로그램 종료 시 FreeConsole() 함수를 호출하여 콘솔 종료  ※Visual Studi0 2013 이후 버전에서는 오류가 발생  [프로젝트 속성 > C/C++ > 전처리기 > 전처리기 정의] 에서 _CRT_SECURE_NO_WARNINGS 를 추가.  ※ cout 또는 wcout 사용 시 locale 설정을 해야 정상적으로 출력됨. Release 모드의 디버깅 : 콘솔에 찍기
  • 41.  Windows 기반 프로그램에서는 다음 함수로 로그를 기록 OutputDebugString(str)  디버깅 중 또는 디버깅이 끝날 때 확인.  확인 방법  [디버그(D) > 창(W) > 출력(O)] 를 통해 출력 창 실행  출력 보기 선택을 ‘디버그’ 로 변경  확인  C#, JS에 대한 로그 남기는 방법은 다음 웹 사이트 참고. Release 모드의 디버깅 : 출력 창에 로그 기록
  • 42.  전역에서 접근 가능한 파일을 생성  또는 싱글톤으로 프로젝트 내에서 접근 가능하도록 구현  해당 예제는 Debug 모드일 때에만 가능하도록 했지만 _DEBUG 를 지우면 Release 모드에서도 사용 가능  로그를 남기는 것을 원하지 않으면 #define _USE_DEBUG_OUTPUT_TEXT를 주석처리  원하는 대로 개조해서 사용  샘플 코드는 다음 링크 참고.  https://gist.github.com/LusainKim/dc3eb19bc51b1322a518 Release 모드의 디버깅 : 파일에 로그 남기기
  • 43.  디버깅을 위한 문자열 선언  sprintf, wsprintf 등의 함수를 이용해 확인을 원하는 값을 문자열에 입력  문자열로 확인 Release 모드의 디버깅 : 문자열 박제
  • 45. 참고 문헌  중단점 창 : https://msdn.microsoft.com/ko-kr/library/aa290723(v=vs.71).aspx  조사식 : https://msdn.microsoft.com/ko-kr/library/4dt5w8ta.aspx  직접 실행 창 : https://msdn.microsoft.com/ko-kr/library/f177hahy.aspx  매크로 : https://msdn.microsoft.com/ko-kr/library/b0084kay.aspx  디버그 출력 : https://t.co/00absV1SnZ  당신의 프로그래밍에 디버깅 더하기 Visual C++ 디버깅 기초에서 고급까지 최홍배 著 (한빛 미디어, 2014, ISBN : 978-89-6848-658-6 15000/비매품)  Debug It! 실용주의 디버깅 폴 부처 著, 박일 譯 (에이콘, 2010, ISBN : 978-89-6077-1413)  유지보수하기 어렵게 코딩하기(모방을 방지하기 위하여 이하 생략)