본문 바로가기
프로그래밍/Code Craft

[2부 코드의 비밀스러운 일생] Chapter9 결함 찾기

by Ohdumak 2017. 11. 10.

인생의 진실

대부분의 버그는 부주의로 일어난다.

많은 부주의한 실수들은 잡아낼 수 있는 것이고, 예방까지 할 수 있는 것

방어적 프로그래밍과 지각 있는 테스트가 우리의 주된 무기

 

버그의  본성

버그가 어떻게 태어나고 생존하고 박멸 될 수 있는지 알아두는 것은 가치 있는 일이다

컴파일 실패

최고의 에러

감지하기가 가장 쉽고, 고치기도 가장 쉽기 때문이다. 가장 직접적이고, 가장 분명하다

런타임 붕괴

에러가 컴파일 에러처럼 눈부시게 분명히 보이기 때문이다

예기치 못한 동작

여러 시간 전에 실행되었던 코드 내부의 사소한 로직 때문

지상에서의 관점

문법에러

컴파일러의 경고 스위치를 모두 켜놓고 빌드하자

빌드에러

프로젝트를 대청소한 다음에 아무 것도 없는 상태에서 다시 빌드하자

큰 타격을 입을 기회가 생기기 전에 발견된 모든 버그를 가능한 한 빨리 박멸하자

기민한 프로그래밍 방법론의 구성요소인 테스트 주도 개발

기초적인 의미론적 버그

런타임 결함의 반 이상이 잘못된 동작을 일으키는 아주 간단한 에러

초기화되지 않은 변수의 사용

의미론적 결함은 대개 정적 분석 툴로 잡을 수 있다

의미론적 버그

이것은 점검 툴에 의해 잡히지 않는 잠복성 에러

 

참호로부터의 관점

세크먼테이션 결함

프로그램에 할당되지 않은 메모리에 접근하는 것이 원인

메모리 오버런

할당된 메모리 범위를 넘어서 데이터를 쓰는 것이 원인

메모리 누출

가비지 컬렉션이 없는 언어에서는 항상 이것이 위협

C에서는 malloc, free /  C++에서는 new, delete 사용

메모리 고갈

메모리는 파일 핸들이나 관리가 필요한 다른 자원과 마찬가지로 항상 고갈될 가능성이 있다

수학 에러

프로그램 행

보통 잘못된 프로그램 로직으로 인해 발생하는 에러

버그 박멸

디버깅 규칙 : 두뇌를 사용하라

소인배의

간단한 테스트 번만으로 문제점을 파악

시간제한을 두고 시간 안에만 그렇게 하자

"정해진 규칙 없이" 디버깅을 때는 적당한 시간제한을 두자

군자의

디버깅할 코드에 대해 공부하자

알지도 못하는 코드에서 에러를 찾는 일은 기대할 없다

결함을 찾을 때는 모든 것을 의심하자. 가능성이 가장 적은 원인이라도 우선 제거하자

 

버그 사냥
컴파일
타임 에러

빌드에 실패했을 때는 번째 컴파일 에러를 살펴보자

런타임 에러

디버깅은 결함이 있는 위치를 천천히 포위해 가는 방법론적인 활동이다

고장을 식별하라

다시 일으켜라

결함의 위치를 찾아라

고장으로부터 알게 사실을 분석하자

의심스러운 코드의 목록을 만들자

프로그램이 붕괴하는 지점에서 시작하고 그곳에서부터 거꾸로 고장의 원인이 있는 곳까지 찾아가자

버그 사냥 정책

  1. 바꿔보기
  2. 분할해서 정복하기
  3. 모의 실행 방법

문제점을 이해하라

테스트 코드를 만들어라

결함을 고쳐라

고쳤다는 것을 증명하라

테스트 케이스를 역행 테스트 스위트에 추가 있다

다른 사람에게 문제 전체를 설명하는 것이 도움이 된다는 것을 있다

페어 프로그래밍

 

결함을 고치는 방법

극히 조심해서 버그를 고치자. 수정하다가 다른 것을 망가뜨릴 위험이 있는 일을 하지 말자

버그를 고칠 때는 그와 연관된 코드 섹션에 똑같은 실수가 숨어 있는지 체크하자

 

버그 예방법

방어적 프로그래밍, 두뇌를 사용하기

 

디버거

가장 알려져 있는 디버깅 , 대화형 , gdb

디버거는 필요할 때만 사용하자.

당신이 설명할 없는 동작을 마주쳤을

디버거를 코드 작동 방법의 이해 수단으로 생각하면서 수시로 순을 뻗치면 된다

메모리 접근 검사기

대화형 , 메모리 누출과 메모리 오버런을 조사

시스템 호출 추적하기

strace같이 시스템 호출을 추적

코어 덤프

로깅

정적 분석기

비대화형 , 소스코드에 잠재적인 문제가 있는지 조사하는 역할


728x90

댓글