3. 프로그램은 왜 실패하는가? 프로그래머가 잘 못 짰기 때문이다 나는 너가 열심히 할 거라고 믿지만, 동시에 너가 분명 몇 개의 결함(defect) 을 만들어 낼 거라고 믿는다
4. 버그는 없다 개발자는 결함(defect) 를 만들어 내는 거지, 저절로 어딘가에서 벌레(버그)가 들어오는 건 아니다 물론 내가 짠 코드가 아닌 다른 코드, 라이브러리, 머신에서 생긴 결함을 만나게 되면, 버그처럼 느껴질 것이다 모든 결함을 다 해결할 수 있고, 결함은 하나도 없을 거라는 자만을 먼저 버려라 항상 ‘만약 ~라면’ 을 준비해라
5. 용어 정리 결함(defect) : 부정확한 프로그램 코드 사람이 만든 것 감염(infection) : 부정확한 프로그램 상태 실패(failure) : 관찰 가능한 부정확한 프로그램 행동 발생 : 결함 -> 감염-> 실패 찾기 : 실패 -> 감염 -> 결함
6. 프로그램 실패 단계 프로그래머가 결함(defect)을 만든다 결함이 감염(infection)을 일으킨다 감염이 퍼진다 감염이 실패(failure)를 일으킨다
7. TRAFFIC Track the problem : 문제점 추적 Reproduce : 실패 재현 Automate : 자동화, 단순화 Find Origins : 감염원 찾기 Focus : 진짜 감염원에 집중 Isolate : 감염 사슬 격리 Correct : 결함 정정
8. 검사의 저주 모든 결함이 실패를 만들지는 않는다 시한폭탄이 들어있는 코드 테스트는 에러가 있다는 것만 증명할 뿐, 에러가 없다는 건 증명하지 못한다 데이크스트라. 1972
9. 디버깅 온전과 감염을 분리한다 무엇을 먼저 볼 것인가 관련이 있는 것과 없는 것을 분리한다
10. 디버깅 기법 단순화된 입력 프로그램 슬라이스 – 7장 상태 관찰 상태 감시 단언 비정상 인과 사슬
15. 디버깅 사례 Track the problem Crash 위치 확인(하지만 일정하지 않음) Reproduce 정확한 재현방법 없음 Automate R 가 해결 안 되면 A 는 할 수 없다
16. 디버깅 사례 Find Origins Crash 중 CVideo 의 m_TestData 소멸자가 자주 보였다 Focus : 진짜 감염원에 집중 저번 업데이트와 비교해 봤더니 m_TestData 가 추가된 것 밖에 바뀐 게 없었다 Isolate : 감염 사슬 격리 m_TestData 를 주석처리했더니 crash 현상이 2시간마다 발생하던 것이 3일마다 발생했다 STL 의 버그인가? 메모리 풀에 버그가 있는 걸까? 여전히 crash 현상은 있고, CVideo 의 데이터가 이상한 값이 저장된다는 새로운 실패(failure)가 올라왔다
17. 디버깅 사례 Find Origins 이전 업데이트 code 와 전체 code 를 diff Focus : 진짜 감염원에 집중 추가된 코드 중에서 의심가는 부분이 있긴 한데, 코드가 몇 천줄이 넘었다 copy & paste 를 한 코드 같아서, 원본 코드와 새로 작성한 코드를 diff 해 보았다 대부분의 코드가 거의 비슷한데, 한 라인에서 리턴값을 smartptr 에 저장하지 않고, raw pointer 에 저장하고 있었다
18. 디버깅 사례 Correct : 결함 정정 암묵적 변환을 막기 위해 explicit 추가 했더니 500 군데가 넘는 코드를 변경해 줘야 했지만, 결국 했다 return new CVideo(nId);-> return CVideoPtr(new CVideo(nid)); m_nRef 가 0 미만이면 로그만 남기는 것이 아니라 개발자에게 이메일을 쏘도록 변경
19. 그 후 달라진 점 1 주일마다 code review 매주 금요일마다 스터디하던 거 다시 시작 심각한 버그 정리 및 기록