ݺߣ

ݺߣShare a Scribd company logo
프로그램은 왜 실패하는가?1. 실패는 어떻게 일어나는가?
최초의 버그
프로그램은 왜 실패하는가?프로그래머가 잘 못 짰기 때문이다나는 너가 열심히 할 거라고 믿지만, 동시에 너가 분명 몇 개의 결함(defect) 을 만들어 낼 거라고 믿는다
버그는 없다개발자는 결함(defect) 를 만들어 내는 거지, 저절로 어딘가에서 벌레(버그)가 들어오는 건 아니다물론 내가 짠 코드가 아닌 다른 코드, 라이브러리, 머신에서 생긴 결함을 만나게 되면, 버그처럼 느껴질 것이다모든 결함을 다 해결할 수 있고, 결함은 하나도 없을 거라는 자만을 먼저 버려라항상 ‘만약 ~라면’ 을 준비해라
용어 정리결함(defect) : 부정확한 프로그램 코드사람이 만든 것감염(infection) : 부정확한 프로그램 상태실패(failure) : 관찰 가능한 부정확한 프로그램 행동발생 : 결함 -> 감염-> 실패찾기 : 실패 -> 감염 -> 결함
프로그램 실패 단계프로그래머가 결함(defect)을 만든다결함이 감염(infection)을 일으킨다감염이 퍼진다감염이 실패(failure)를 일으킨다
TRAFFICTrack the problem : 문제점 추적Reproduce : 실패 재현Automate : 자동화, 단순화Find Origins : 감염원 찾기Focus : 진짜 감염원에 집중Isolate : 감염 사슬 격리Correct : 결함 정정
검사의 저주모든 결함이 실패를 만들지는 않는다시한폭탄이 들어있는 코드테스트는 에러가 있다는 것만 증명할 뿐, 에러가 없다는 건 증명하지 못한다데이크스트라. 1972
디버깅온전과 감염을 분리한다무엇을 먼저 볼 것인가관련이 있는 것과 없는 것을 분리한다
디버깅 기법단순화된 입력프로그램 슬라이스 – 7장상태 관찰상태 감시단언비정상인과 사슬
디버깅 사례int_tmain(intargc,_TCHAR*argv[]){// ...CVideo*p1=CreateVideo(1);wcout<<p1->m_nId;// ...return0;}
디버깅 사례classCVideo:publicCObj{public:CVideo(intnId):m_nId(nId){AddRef();}~CVideo(){wcout<<L"CVideo destructor\n";}intm_nId;vector<int>m_TestData;// new added member};int_tmain(intargc,_TCHAR*argv[]){// ...CVideo*p1=CreateVideo(1);wcout<<p1->m_nId;// ...return0;}
디버깅 사례classCVideo:publicCObj{public:CVideo(intnId):m_nId(nId){AddRef();}~CVideo(){wcout<<L"CVideo destructor\n";}intm_nId;vector<int>m_TestData;// new added member};typedefCSmartPtr<CVideo>CVideoSP;CVideoSPCreateVideo(intnId){returnnewCVideo(nId);}int_tmain(intargc,_TCHAR*argv[]){// ...CVideo*p1=CreateVideo(1);wcout<<p1->m_nId;// ...return0;}
디버깅 사례classCObj{public:CObj():m_nRef(0){}virtual~CObj(){}intAddRef(){return++m_nRef;}boolRelease(){--m_nRef;if(0==m_nRef){//return_to_pool(this); // reason 3deletethis;returntrue;}elseif(m_nRef<0){//_ASSERT_EXPR(0, L"over release!"); // reason 4}returnfalse;}staticvoid*operatornew(size_tsize){//void *p=allocate_from_pool(size);void*p=malloc(size);returnp;}staticvoidoperatordelete(void*p){//_ASSERT_EXPR(0, L"don't delete CObj");free(p);}intm_nRef;};template<typenameT>classCSmartPtr{public:typedefCSmartPtr<T>this_type;CSmartPtr():m_p(NULL){}//explicit CSmartPtr(T* p) : m_p(p) {}CSmartPtr(T*p):m_p(p){}// reason 1~CSmartPtr(){if(m_p){m_p->Release();}}T&operator*()const{return*m_p;}T*operator->()const{returnm_p;}operatorT*(){// reason 2returnm_p;}private:T*m_p;};
디버깅 사례Track the problemCrash 위치 확인(하지만 일정하지 않음)Reproduce정확한 재현방법 없음AutomateR 가 해결 안 되면 A 는 할 수 없다
디버깅 사례Find OriginsCrash 중 CVideo 의 m_TestData 소멸자가 자주 보였다Focus : 진짜 감염원에 집중저번 업데이트와 비교해 봤더니 m_TestData 가 추가된 것 밖에 바뀐 게 없었다Isolate : 감염 사슬 격리m_TestData 를 주석처리했더니 crash 현상이 2시간마다 발생하던 것이 3일마다 발생했다STL 의 버그인가? 메모리 풀에 버그가 있는 걸까?여전히 crash 현상은 있고, CVideo 의 데이터가 이상한 값이 저장된다는 새로운 실패(failure)가 올라왔다
디버깅 사례Find Origins이전 업데이트 code 와 전체 code 를 diffFocus : 진짜 감염원에 집중추가된 코드 중에서 의심가는 부분이 있긴 한데, 코드가 몇 천줄이 넘었다copy & paste 를 한 코드 같아서, 원본 코드와 새로 작성한 코드를 diff 해 보았다대부분의 코드가 거의 비슷한데, 한 라인에서 리턴값을 smartptr 에 저장하지 않고, raw pointer 에 저장하고 있었다
디버깅 사례Correct : 결함 정정암묵적 변환을 막기 위해 explicit 추가했더니 500 군데가 넘는 코드를 변경해 줘야 했지만, 결국 했다return new CVideo(nId);-> return CVideoPtr(new CVideo(nid));m_nRef 가 0 미만이면 로그만 남기는 것이 아니라 개발자에게 이메일을 쏘도록 변경
그 후 달라진 점1 주일마다 code review매주 금요일마다 스터디하던 거 다시 시작심각한 버그 정리 및 기록

More Related Content

Similar to 프로그램은 왜 실패하는가 1장 (20)

[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
Ryan Park
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
Ryan Park
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
Ryan Park
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
Ryan Park
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
준혁 이
HI-ARC PS 101
HI-ARC PS 101HI-ARC PS 101
HI-ARC PS 101
Jae-yeol Lee
Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018
KyungHo Jung
Object C - RIP
Object C - RIPObject C - RIP
Object C - RIP
Dong Heon Cho
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
Dong Jun Kwon
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
JinTaek Seo
Visual studio 2010
Visual studio 2010Visual studio 2010
Visual studio 2010
MinGeun Park
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2
성일 한
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
주항 박
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
양 한빛
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
Sang Don Kim
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
Chris Ohk
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
Ryan Park
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
Ryan Park
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
영욱 오
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
Ryan Park
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
Ryan Park
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
Ryan Park
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
준혁 이
Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018Droid knights android test @Droid Knights 2018
Droid knights android test @Droid Knights 2018
KyungHo Jung
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
Dong Jun Kwon
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
JinTaek Seo
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2
성일 한
포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전포스트모템디버깅과 프로세스 덤프 실전
포스트모템디버깅과 프로세스 덤프 실전
주항 박
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
track1 05. 스타트업 1인 개발 극복기’와 ‘javascript vs Scala, (함수형 언어 관점으로)방황기/ I/O Inc, ...
양 한빛

More from Ryan Park (19)

위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
Ryan Park
Domain Driven Design Ch7
Domain Driven Design Ch7Domain Driven Design Ch7
Domain Driven Design Ch7
Ryan Park
Taocp1 2 4
Taocp1 2 4Taocp1 2 4
Taocp1 2 4
Ryan Park
즉흥연기왶Ķ로그래밍
즉흥연기왶Ķ로그래밍즉흥연기왶Ķ로그래밍
즉흥연기왶Ķ로그래밍
Ryan Park
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLID
Ryan Park
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기
Ryan Park
Unicode100
Unicode100Unicode100
Unicode100
Ryan Park
Unicode
UnicodeUnicode
Unicode
Ryan Park
Unicode
UnicodeUnicode
Unicode
Ryan Park
Unicode
UnicodeUnicode
Unicode
Ryan Park
Oop design principle
Oop design principleOop design principle
Oop design principle
Ryan Park
나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10
Ryan Park
나도(기술서)번역번볼까
나도(기술서)번역번볼까나도(기술서)번역번볼까
나도(기술서)번역번볼까
Ryan Park
Programming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. RavenProgramming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. Raven
Ryan Park
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8
Ryan Park
온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅
Ryan Park
UnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDUnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPD
Ryan Park
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And How
Ryan Park
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Ryan Park
위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
Ryan Park
Domain Driven Design Ch7
Domain Driven Design Ch7Domain Driven Design Ch7
Domain Driven Design Ch7
Ryan Park
즉흥연기왶Ķ로그래밍
즉흥연기왶Ķ로그래밍즉흥연기왶Ķ로그래밍
즉흥연기왶Ķ로그래밍
Ryan Park
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLID
Ryan Park
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기
Ryan Park
Oop design principle
Oop design principleOop design principle
Oop design principle
Ryan Park
나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10
Ryan Park
나도(기술서)번역번볼까
나도(기술서)번역번볼까나도(기술서)번역번볼까
나도(기술서)번역번볼까
Ryan Park
Programming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. RavenProgramming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. Raven
Ryan Park
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8
Ryan Park
온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅
Ryan Park
UnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDUnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPD
Ryan Park
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And How
Ryan Park
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Ryan Park

프로그램은 왜 실패하는가 1장