C, Objective-C 또는 C ++로 코딩 하는 경우 CLang 정적 분석기 를 사용 하여 소스를 실제로 실행하지 않고 비평 할 수 있습니다.
사용 가능한 메모리 디버깅 도구는 ValGrind, Mac OS X의 Guard Malloc, * NIX의 Electric Fence입니다.
일부 개발 환경은 디버깅 메모리 할당자를 사용할 수있는 옵션을 제공합니다.이 할당기에는 새로 할당 된 페이지 및 새로 해제 된 페이지를 가비지로 채우고 할당되지 않은 포인터의 해제를 감지하고 디버거를 사용하여 각 힙 블록 전후에 일부 데이터를 쓰는 등의 작업이 수행됩니다. 해당 데이터의 알려진 패턴이 변경되면 호출됩니다.
Slashdot의 일부 직원은 디버거에서 새로운 스테핑 소스를 사용하여 단일 스테핑에서 많은 가치를 얻었습니다. "그게 다야"그는 말했다. 나는 항상 그의 조언을 따르지는 않지만 제가 가지고있을 때 매우 도움이되었습니다. 드문 코드 경로를 자극하는 테스트 사례가없는 경우에도 디버거의 변수를 돌려서 이러한 경로를 가져 와서 메모리를 할당 한 다음 디버거를 사용하여 새 포인터를 NULL 대신 NULL로 설정하면됩니다. 메모리 주소를 할당 한 다음 할당 실패 처리기를 단계별로 실행합니다.
어설 션-C, C ++ 및 Objective-C의 assert () 매크로를 사용하십시오. 언어가 어설 션 기능을 제공하지 않으면 직접 작성하십시오.
어설 션을 자유롭게 사용하고 코드에 그대로 둡니다. assert () "테스트를 계속하는 테스트"를 호출합니다. 나는 대부분의 함수의 진입 점에서 전제 조건을 확인하기 위해 가장 일반적으로 사용합니다. 이것은 에펠 프로그래밍 언어에 내장 된 "계약에 의한 프로그래밍"의 한 부분입니다. 다른 부분은 사후 조건, 즉 함수 반환 지점에서 assert ()를 사용하지만 전제 조건만큼 많은 마일리지를 얻지 못한다는 것을 알았습니다.
assert를 사용하여 클래스 불변량을 확인할 수도 있습니다. 클래스가 변하지 않는 클래스를 반드시 요구하지는 않지만, 현명하게 디자인 된 클래스에는 클래스가 있습니다. 클래스 불변은 객체를 일시적으로 일관성이없는 상태로 만들 수있는 멤버 함수 내부가 아닌 항상 참인 조건입니다. 이러한 기능은 반환하기 전에 항상 일관성을 복원해야합니다.
따라서 모든 멤버 함수는 시작 및 종료시 불변을 확인할 수 있으며 클래스는 다른 코드가 언제든지 호출 할 수있는 CheckInvariant라는 함수를 정의 할 수 있습니다.
코드 커버리지 도구를 사용하여 실제로 테스트중인 소스 라인을 확인한 다음 테스트되지 않은 라인을 자극하는 테스트를 설계하십시오. 예를 들어 물리적 메모리가 거의없고 스왑 파일이 없거나 매우 작은 VM 내에서 앱을 실행하여 메모리 부족 처리기를 확인할 수 있습니다.
BOS 파일 시스템을 작성한 Dominic Giampaolo는 스왑없이 BeOS를 실행하지 말라고 강력히 권유했습니다. 이것이 왜 중요한지 확인하지만 일종의 구현 아티팩트 일 것입니다.)
또한 I / O 오류에 대한 코드 응답을 테스트해야합니다. 모든 파일을 네트워크 공유에 저장 한 다음 앱의 작업량이 많은 동안 네트워크 케이블을 분리하십시오. 네트워크를 통해 통신하는 경우 마찬가지로 케이블을 분리하거나 무선을 끄십시오.
특히 분노한 것은 강력한 자바 스크립트 코드가없는 웹 사이트입니다. Facebook의 페이지는 수십 개의 작은 Javascript 파일을로드하지만 그 중 하나가 다운로드되지 않으면 전체 페이지가 중단됩니다. 다운로드를 다시 시도하여 오류 허용을 제공하거나 일부 스크립트가 다운로드되지 않은 경우 합리적인 폴백을 제공 할 수있는 방법이 있어야합니다.
크고 중요한 파일을 작성하는 도중에 디버거 또는 * NIX의 "kill -9"로 앱을 종료하십시오. 앱의 아키텍처가 잘 설정되어 있으면 전체 파일이 쓰여지거나 전혀 쓰여지지 않거나 부분적으로 만 쓰여지면 쓰여진 내용이 손상되지 않고 저장된 데이터를 완전히 사용할 수 있습니다. 파일을 다시 읽을 때 응용 프로그램.
데이터베이스에는 항상 내결함성 디스크 I / O가 있지만 다른 종류의 앱은 거의 없습니다. 저널 파일 시스템은 정전 또는 충돌시 파일 시스템 손상을 방지하지만 최종 사용자 데이터의 손상 또는 손실을 방지하기 위해 아무 것도하지 않습니다. 이는 사용자 응용 프로그램의 책임이지만 데이터베이스 이외의 다른 방법으로는 내결함성을 구현하지 않습니다.