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