목록Effective (40)
센로그
다형성을 가진 기본 클래스에서 비가상 소멸자를 사용한다면?파생 클래스를 삭제할 때, 파생 클래스의 소멸자는 호출되지 않는다.즉, 기본 클래스의 포인터로 파생 클래스를 가리키는 경우, 기본 클래스의 소멸자만 호출되므로 파생 클래스 부분은 소멸하지 않고 남아있다.따라서, 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다.즉, 어떤 클래스가 가상 함수를 하나라도 갖고 있다면, 이 클래스의 소멸자도 가상 소멸자여야 한다. 가상 함수의 동작클래스에 가상 함수가 하나라도 있는 경우, 해당 클래스에 별도의 자료구조가 하나 더 들어가게 된다.클래스의 vtbl(가상 함수 테이블)을 가리키는 vptr(가상 함수 테이블 포인터)이 추가된다.어떤 객체에 대해 어떤 가상 함수가 호출되려고 하면, 호출되는 실제 ..
한 곳에서 발생한 에러는 다른 부분에서도 나타날 가능성이 높다.개발자의 코드 작성 스타일이 비슷하기 때문이기도 하고, 특정한 API를 사용할 때마다 잘못 작성했기 때문일 수도 있고, 오류가 담긴 코드를 그대로 복사해서 썼을 수도 있기 때문이다.따라서 오류 하나를 수정한 뒤에는 이와 비슷한 유형의 오류도 찾아서 해결한다.IDE에서 제공하는 검색기능이나 커맨드 명령을 사용하여 비슷한 경우를 모두 찾아보고 수정한다.나중에 비슷한 에러가 발생하지 않도록 적절히 조치한다.가령 코드를 수정할 때마다 검사할 수 있도록 개발 프로세스에 반영할 수 있다.
본격적인 디버깅에 들어가기 전에 작업 환경에서 오류가 발생하지 않도록 정리한다.코드를 깔끔하게 정리하는 것이 미묘한 버그를 해결하는 데 도움이 될 수 있다.따라서 다음과 같은 문제들을 우선 정리하도록 한다. 도구를 사용하여 쉽게 찾을 수 있는 문제수정 가능한 어서션 실패처럼 프로그램 실행 과정에서 발생하는 경고 메시지읽기 힘들게 작성된 코드에서 문제가 발생하는 경우주석에 XXX, FIXME, TODO와 같은 문구가 표시되어 있거나 should, think, must와 같이 뭔가 책임을 회피하는 듯한 문장이 담긴 미심쩍은 코드그밖에 무시했던 사소한 버그물론, 잘 돌아가면 건드리지 않는 것이 좋다고 생각할 수도 있다. 실제로 그런 경우도 많다.따라서 상황에 맞게 판단하여 정리해야 한다.코드를 깔끔하게 정리하..
오류의 원인에 대한 모든 경우의 수를 탐색하는 작업을 자동화한다.시스템에 장애를 발생시키는 요인은 다양하며 그중 어떤 것이 근본 원인인지 쉽게 찾아내기 힘들다.따라서 문제를 발생시키는 모든 경우를 샅샅이 뒤져야 하므로, 간단한 루틴이나 스크립트를 작성해서 확인할 수 있다.현재 디버깅하는 소프트웨어에서 직접 스크립트를 작성하여 탐색하는 방식을 적용하기 힘들다면, 이런 작업을 수행하는 코드를 프로그램 안에 추가하도록 한다예를들어 모든 경우의 수를 생성하는 알고리즘을 구현하여 넣거나, 파일로 저장하여 파일로부터 값을 받게 할 수도 있다.
자신의 작업 환경이 아닌 곳에서 일하면 생산성이 크게 떨어진다.하드웨어에 밀접한 문제에 대한 디버깅 작업을 자신이 사용하는 컴퓨터의 화면과 키보드로 작업할 수 있도록 장치 에뮬레이터를 설치한다. 임베디드 소프트웨어를 디버깅할 때는 애플리케이션의 핵심 영역을 자신의 기기에서 실행할 수 있도록 소프트웨어 형태의 쐐기(shim) 모듈을 만들 수 있다.자신이 사용하는 개발 머신에서 제공하는 도구를 활용할 수 있도록 하기 위한 목적이다.시스템의 중간에서 특정 부분을 캡슐화 하여 독립적으로 동작하도록 하거나, 코드 변경 없이 다른 계층과 상호작용할 수 있도록 돕는 것이다.독립적으로 컴파일하여 실행할 수 있는 단위로 만들어놓고 디버깅한다. 원격 디버깅 환경 구축하기고객의 PC에서 발생한 문제를 해결할 때는 원격에서 ..
발생하는 문제가 눈에 잘 띄게 만들면 디버깅 작업의 효율을 높일 수 있다.문제가 항상 발생하도록 한다든지, 의심되는 코드 이외의 다른 부분을 모두 주석처리 해본다든지 하는 방법이 있다.이때 모든 작업을 버전 관리 시스템을 통해 브랜치로 관리하도록 한다. 버그가 발생하는 것을 보는 것조차 힘든 경우도 있다특히 게임에서, 특정 이벤트가 발생할 때마다 이유 없이 버그가 발생하는 경우가 많다.이런 경우 특정 이벤트를 추측하여 이벤트가 더 자주 발생하도록 하거나, 발생하는 버그의 수준을 높여볼 수 있다.예를들어 갑자기 캐릭터의 파워가 살짝 높아지는 버그가 발생할 수 있다.이런 경우 변화량이 미미하기 때문에, 다른 경우에서도 발생한다는 것을 눈치채지 못하는 것일 수도 있다.따라서 파워가 급격히 증가하도록 코드를 수..