C a l e n d a r
2010 . 09
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
T r a c k b a c k s
A r c h i v e s
G u e s t i c l e s
Total
0
Today
0
Yesterday
0
Pageview *
0
Pageview Td
0
Pageview Yd
0
Members
31
Articles
199
Comments
46
DB Size Using
1.93 mb
Attachment
13.83 mb
Apr
02
프로그램은 왜 실패하는가 2장 요약
2007 at 08:36 AM

2장: 문제점 추적

 

1. 문제점의 수명주기

* 사용자 -> 제작사 문제점 보고
문제점 재현
* 문제 상황 격리
* 코드에서 결함을 찾고 교정
* 교정 결과물을 사용자에게 돌려줌

--> 수명주기의 조직화 필요

1. 문제점이 드러나 있는지 (소프트웨어에 결함이 존재)
2. 가장 심각한 문제점은 무엇인지 (심각도 순서대로 교정 필요)
3. 과거 문제점 사례발생 여부 (기존의 해결책 이용 가능성)

[ 대규모 디버깅 공정을 어떻게 조직화할 것인가? ]
 

 

2. 문제점 보고

* 문제점 보고 (Problem Report) == 변경요청 == 버그리포트
* 문제점 보고에 쓸데없지 않은 것만 포함시켜야 함
  --> 그러기 위해서 '유관사실'만을 판별하고, 구체적 항목으로 목록화

* 문제점 보고에 포함시켜야 할 내용 (기본원칙)

¤ 제품 릴리즈 (제품버전번호 or 기타 고유식별자)
¤ 운영 환경 (운영체제 버전) --> 일반화(다른 운영환경도 테스트)
¤ 시스템 자원 (CPU 부하,디스크 용량 , 메모리 ..)
¤ 문제점 내력(History)
¤ 기대되는 행동에 대한 서술 (~했어야 했는데, 안했다)
¤ 실제 일어난 행동(증상)
    - 최대한 중립적
    - 사실만을 기술
¤ 한 줄짜리 요약문 (문제의 핵심 포착)
    - 개발자가 문제점 측정시의 심각도 기초
    - 로그 파일 등
    - 문제점: 사용자가 자신의 정보 유출을 꺼림

 

 

3. 문제점 관리

* 한번에 오직 한 사람만 문제점 문서를 다루어야 한다.
    - 버전 관리 시스템에서는 분리 병합
* 이전의(교정된) 문제점에 대한 내력이 사라진다.
    - 버전 관리 시스템에서는 변경 내력 유지 가능
규모 가변성이 없다.
    - 하나의 통합된 문서 형태로 관리가 가능해야 함.
       ---> 그러기위해서, 문제점 데이터베이스에 모든 문제점 보고들을 저장
              ex) BugZilla
 

 

4. 문제점 분류

# 각 애트리뷰트별로 문제점을 분류

* 심각도 (Severity) - '차단, 치명, 주요, 보통, 부차, 사소' 레벨이 부여
* 우선순위 (Priority) - 개발/문제해결 공정을 조절하는 핵심 기준
* 식별자 (identifier) - 특정 문제점 지칭용
* 주석 (comment) - 문제환경 정보 기입 / 해결책 논의
* 통지
   - 문제점보고시 이메일주소 첨부 --> 문제점보고 변경시 자동통지 받음

# 이상적인 제품은 심각한 문제점을 모두 고친 후에 출시 되어야 함.

 

 

5. 문제점 처리

* Unconfirmed (아직 누구도 재현해 보지 않은 상태)
* New (문제점 보고가 있어야 유효함 , 유관 사실이 포함되어 있어야 함)
* Assigned (개발자에 배정됨)
* Resolved (해소됨)
* 처리결과
    - fixed
    - Invalid (문제점이 아니거나 유관 정보가 없음)
    - Duplicate
    - WONTFIX (교정 불가)
    - WorksForme(재현 불가)
    - VERIFIED (교정 후 검증 성공)
    - Close (제품의 새 릴리즈가 만들어짐)
    - Reopen (동일 문제 발생시는, new가 아닌 reopen)
 

 

6. '문제점 추적' 관리

* 문제점 정리/보관자는?
* 문제점 보고 분류자는?
* 우선순위 설정자는?
    - 문제점 발생 가능성
    - 영향을 받는 사용자수
    - 피해 가능성
* 문제점 처리자는?
* 문제점 종결자는?
* 문제점 수명주기는?
 

 

7. '문제점 == 요구사항'

* 문제점은 개발 과정에서 사용 가능
* 요구사항이 주요 문제점
* 요구사항에 따른 중요도 선정
* 계통구조를 지원 해야 함 (세분화 지원)
 

 

8. 중복의 관리

* 최대한 많은 사실을 포함
* 중복을 찾기 위해서는 최대한 적은 사실들이 바람직
* 교정의지 없는 문제점: 개발자가 더이상 지원의사 없음 (BugZilla: Won't Fix)
    - 오래된 딱 한번 발생한 문제점
    - 오직 내부에서만 발생한 문제점
 

 

9. 문제점과 교정의 연계

* 개발자가 버전별 소스/도구를 사용가능 해야함
  --> 그래야만 개발자 PC에서 재현 가능
* 임의의 구성(형상)을 언제라도 재현할 수 있어야 함
* 소프트웨어 형상관리버전 관리 시스템을 이용
 

 

10. 문제점과 테스트의 연계

* 실패한 테스트와 문제점을 어떻게 동기화할 것인가?
테스트 결과문제점 보고분리하도록 권장
    - 테스트 결과는 자주 생성됨.
    - 테스트는 결과를 굳이 어딘가에 저장할 필요가 없음
    - 테스트 실패 시 만일 즉시 교정 가능하면 기록의 필요가 없음.
* 테스트 케이스들은 문제점 보고를 퇴물로 만든다.
* 문제점 발생시 재현 가능한 테스트 케이스를 작성
 


- 도구 -

벅질라 (www.bugzilla.org)
모질라의 벅질라 사용예 (bugzilla.mozilla.org)
phpBugTracker: 상대적으로 가벼운 버그추적 시스템 (phpbt.sf.net)
그밖에... Trac / IssueTracker / SourceForge / GForge ...

연습문제는 나~중에 실제로 디버깅 할 일 있을 때 직접 풀어보자 ~~~!

태그 : 프로그램 , , 실패 , 2장 , 요약 , 버그 , 결함
Mar
22
프로그램은 왜 실패하는가 1장 요약
2007 at 08:16 PM
제가 존경하는 서우석님의 DebugLab 에서 스터디를 진행하는데,
이것은 이번주 월요일까지 2주간 공부한 "프로그램은 왜 실패하는가"의 내용을 요약한 것입니다.. (1장~4장: 바로바로 복습하면서 계속 편집을 수정해가다 보니 게시물이 길어지기에.. 각 장별로 나누어야겠습니다^^)

아니 뭐... 사실은 다다음 스터디 때 발표해야 하기 때문에 연결되는 앞부분 내용을 이해하기 위해 간단히 복습하면서 정리만 한 것입니다.
요약은 이제껏 발표하신 분들이 올려주신 프리젠테이션 자료를 아주 조금 더 간추린 정도입니다.
저는 4월16일에 7장을 발표하는데, 큰일 났습니다. ㅎ_ㅎ;
잘 할 수 있을지...... 게다가 저는 실무자가 아닌데 디버깅 툴 동영상은 또 어찌 만들라는 ~~~... 시련입니다.


< Why Programs Fail >

1장: 실패는 어떻게 일어나는가
 

1. 결함 ------> 실패

* 프로그래머가 결함(감염 발생할 수 있는 코드 일부)을 만듬
  - 예측 불가능 / 복수의 모듈간에 인터페이스 비호환

* 결함에서 감염이 발생 (반드시 발생하는 건 아님, 가능성)

* 감염의 확산

* 실패의 발생 (실패: 프로그램 실행시 겉으로 드러나는 오류)
 

 

2. 시공의 디버깅

* 디버깅 7단계 (TRAFFIC)

Track  (문제 추적)
Reproduce  (실패 재현)
Automate  (자동화, 단순화)
Find  (감염원 탐색)
Focus  (감염원 후보에 촛점)
Isolate  (감염사슬 격리)
Correct  (결함 정정)

- 문제를 추적하고 다시 일으켜보고, 자동화하여 탐색한 후 가능성있는 후보에 촛점을 맞추고 원인으로 보이는것을 격리한 후 정정한다.

* 실패 발생 원인은 F.F.I 에서 발견하게 된다.

* 시간/공간 조사  (온전-->감염으로 전이가  언제/어떻게? ; 디버깅 목표임)
  - 변수/참조 수가 늘수록 탐색해야할 시공간 방대
  - 확실한 지점 (온전한 초기점 / 일부가 감염된 지점)
  - 온전과 감염의 분리, 유관과 무관의 분리

* 의존 사슬: 실패에서부터 이전 변수값들로 이어지는 의존 관계 사슬
* 프로그램 코드/상태 구조화: 함수,모듈,객체..
 

 

3. 프로그램이 이상해요

* 실패 경로:  결함(Defect) --> 감염(Infection) --> 실패(Failure)

* 최초 버그 1947.09.09 하바드 마크 II, 나방이 끼어 죽음

* 프로그램 결함은 프로그래머로 인함.
 

 

4. 실패 ---> 교정

* 문제점 추적문제보고서를 기록/보관하는 일
  - 실패과정도 문제재현 절차에 포함

* 복잡한 프로그램의 경우, 실패 재현의 자동화 필요 (사람이 일일이 재현하기 힘듬) - (3장,5장)

* 감염원 후보 찾기
  - 출력이 0이 되는 원인 찾는다
  - 연역(7장)이 어려울 때는, 실패 과정 관찰(8장)
  - 가능성의 영역을 좁혀나감 (수사 과정)
  - 프로그램 실행 도중의 상태관찰 수단 필요

* 유력 후보 감염원에 촛점 맞추자

* 감염원 격리

* 결함 정정 :  이렇게 수정한 후 실패가 안 나타나면, 역시나 그 결함이 실패원인이었음이 입증됨.
 

 

5. 자동화 디버깅 기법

* 입력 단순화 (델타디버깅 - 5장)

* 프로그램 슬라이스 (오류 연역 - 7장): 프로그램 실행시 발생 가능/불가능한 사건을, 코드로부터 도출 (추상 ---> 구체)

* 상태 관찰 (사실 관찰 - 8장): 디버거 이용, 프로그램의 특정 상태에 정지시켜 관찰 가능 / 프로그램 변경이나 리컴파일 없이 실행중 관찰 가능

* 상태 감시 (8장): 상태 일부가 실행도중 어떻게 변하는지 관찰 (변수의 감염 순간 포착 가능)

* 단언 (기대의 단언 - 10장): 관찰값/의도값 비교, 함수나 프로그램 전체에서 성립해야 하는 불변식

* 비정상 (비정상 검출 - 11장): 정상/실패 실행간의 차이로부터 비정상을 식별해냄.

* 인과 사슬 (인과사슬의 격리 - 14장): 프로그램 상태에 델타디버깅 적용. 인과관계 원인이 반드시 오류는 아님, 실패요인을 좁혀나갈 수 있다.

* 여러 기법 종합 사용 (결함 고치기 - 15장): 앞의 언급한 다양한 기법들을 연동

* 기타 (실패추적-2장, 자동검사-3장, 실패재현-4장, 여러추론기법결합-6장, 실패원인체계적탐색-12장)
 

 

6. 용어 비교/차이

(1) 버그: 사람이 제어가능하거나, 사람에게 책임이 없는 '어떤 것' 암시 / 의미 불분명 / 프로그램의 부정확한 상태,코드,동작 모두를 구분없이 두루두루 지칭하여 혼동을 일으킴 (원인과 증상의 모호)

(2) 결함: 부정확 코드

(3) 감염: 부정확 상태

(4) 실패: 눈에 보이는 수행/동작 버그

# 코드 --> 상태 --> 실행 (버그 발견시, 버그 추적, 버그 교정)
따라서, 용어 의미 불분명으로 혼란스러움,, 아래와 같이 고치면...
# 결합 --> 감염 --> 실패 (실패 발견시, 감염 추적, 결함 교정)

(5) 결점: 전반적 설계/구조 결함  (결함보다 심각)

# 버그:  프로그래머가 그저 짜증스러움에서 대충 뭉뚱그려 사용하는 표현
- 정확한 용어선택으로 실패 근원을 구체화
- 버그라는 용어는 웬지 소프트웨어에 이유없이 자동발생하는 것처럼 느껴짐
- 오류/잘못: 웬지 명백한 인간만의 잘못인 듯한 뉘앙스
- 결함/감염: 반드시 인간의 실수만은 아닌 듯한 느낌, 불필요한 죄책감 모면
 


- 도구 -

Algorithmic and Automatic Debugging Home Page
http://www.cs.nmsu.edu/~jeffery/aadebug.html
1