프로그램은 왜 실패하는가?<br />1. 실패는 어떻게 일어나는가?<br />
최초의 버그<br />
프로그램은 왜 실패하는가?<br />프로그래머가 잘 못 짰기 때문이다<br />나는 너가 열심히 할 거라고 믿지만, 동시에 너가 분명 몇 개의 결함(defect) 을 만들어 낼 거라고 믿는다<br />
버그는 없다<br />개발자는 결함(defect) 를 만들어 내는 거지, 저절로 어딘가에서 벌레(버그)가 들어오는 건 아니다<br />물론 내가 짠 코드가 아닌 다른 코드, 라이브러리, 머신에서 생긴 결함을 만나게 되면...
용어 정리<br />결함(defect) : 부정확한 프로그램 코드<br />사람이 만든 것<br />감염(infection) : 부정확한 프로그램 상태<br />실패(failure) : 관찰 가능한 부정확한 프로그램 행...
프로그램 실패 단계<br />프로그래머가 결함(defect)을 만든다<br />결함이 감염(infection)을 일으킨다<br />감염이 퍼진다<br />감염이 실패(failure)를 일으킨다<br />
TRAFFIC<br />Track the problem : 문제점 추적<br />Reproduce : 실패 재현<br />Automate : 자동화, 단순화<br />Find Origins : 감염원 찾기<br />Fo...
검사의 저주<br />모든 결함이 실패를 만들지는 않는다<br />시한폭탄이 들어있는 코드<br />테스트는 에러가 있다는 것만 증명할 뿐, 에러가 없다는 건 증명하지 못한다<br />데이크스트라. 1972<br />
디버깅<br />온전과 감염을 분리한다<br />무엇을 먼저 볼 것인가<br />관련이 있는 것과 없는 것을 분리한다<br />
디버깅 기법<br />단순화된 입력<br />프로그램 슬라이스 – 7장<br />상태 관찰<br />상태 감시<br />단언<br />비정상<br />인과 사슬<br />
디버깅 사례<br />int_tmain(intargc,_TCHAR*argv[]){<br />// ...<br />CVideo*p1=CreateVideo(1);<br />wcout&lt;&lt;p1-&gt;m_nId;<b...
디버깅 사례<br />classCVideo:publicCObj{<br />public:<br />CVideo(intnId):m_nId(nId){<br />AddRef();<br />}<br />~CVideo(){<br ...
디버깅 사례<br />classCVideo:publicCObj{<br />public:<br />CVideo(intnId):m_nId(nId){<br />AddRef();<br />}<br />~CVideo(){<br ...
디버깅 사례<br />classCObj{<br />public:<br />CObj():m_nRef(0){}<br />virtual~CObj(){}<br />intAddRef(){return++m_nRef;}<br />b...
디버깅 사례<br />Track the problem<br />Crash 위치 확인(하지만 일정하지 않음)<br />Reproduce<br />정확한 재현방법 없음<br />Automate<br />R 가 해결 안 되면...
디버깅 사례<br />Find Origins<br />Crash 중 CVideo 의 m_TestData 소멸자가 자주 보였다<br />Focus : 진짜 감염원에 집중<br />저번 업데이트와 비교해 봤더니 m_Test...
디버깅 사례<br />Find Origins<br />이전 업데이트 code 와 전체 code 를 diff<br />Focus : 진짜 감염원에 집중<br />추가된 코드 중에서 의심가는 부분이 있긴 한데, 코드가 몇 ...
디버깅 사례<br />Correct : 결함 정정<br />암묵적 변환을 막기 위해 explicit 추가<br />했더니 500 군데가 넘는 코드를 변경해 줘야 했지만, 결국 했다<br />return new CVide...
그 후 달라진 점<br />1 주일마다 code review<br />매주 금요일마다 스터디하던 거 다시 시작<br />심각한 버그 정리 및 기록<br />
Upcoming SlideShare
Loading in …5
×

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

1,222 views
1,073 views

Published on

Why Programs Fail

Published in: Education, Technology, Sports
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,222
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

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

×