답변:
아무것도 가정하지 마십시오
종종 "오, 나는이 코드가 무엇을하고 있는지 잘 알고있다"고 말하고 싶은 유혹을 느낀다. 하지마 모든 가정을 테스트하고 모든 것을 신중하게 살펴보십시오.
나누고 정복하는 것이 좋습니다. 문제가 존재하는 가시적 인 입력 (사용자 입력 / 네트워크 이벤트 ...)과 출력 (로그, 사용자에게 출력, 아웃 바운드 네트워크 메시지 ...)을 식별하십시오. 상당한 크기의 청크 또는 그 사이에 중요한 부분에 인쇄물을 넣고 코드의 버그 위치를 좁히십시오.
버전 제어 코드에 대한 회귀의 경우에도 분할 및 정복이 매우 효과적입니다. 두 가지 빌드를 찾으십시오-하나는 예상대로 작동하고 다른 하나는 회귀와 함께 작동합니다. 잠재적 인 용의자로서 많은 체크인이 남을 때까지 간격을 좁히십시오.
다른 사람들이 말했듯이-아무것도 가정하지 마십시오. 코드를 작성한 경우 특히 그렇습니다. 다른 코드를 디버깅 할 때는 코드가 처음이거나 코더를 신뢰하지 않기 때문에 속도가 느려질 수 있습니다. 자신의 코드를 디버깅 할 때 코드를 올바르게 작성했다고 가정하기가 너무 느리면 속도가 느려집니다!
실제 디버깅 프로세스 :
디버거를 사용하는 것보다 단위 테스트를 추가하고 먼저 로깅하는 것이 더 효율적입니다. 또한 향후 버그를 도입하지 않도록 단위 테스트를 수행하면 로깅을 통해 향후 세션 디버깅에 도움이됩니다.
작은 코드 조각을 단계별로 진행하기 전에 결과를 정확하게 결정할 수 있는지 확인하십시오. 이것은 BTW에 투표 한 것으로 생각하지 않는 얼굴에 날아가는 경향이 있지만 경험을 쌓으면 볼 곳을 좁히는 데 도움이 될 수 있습니다.
이것은 사소한 것처럼 들리지만 디버거의 뉘앙스를 배우고 단축키를 배우십시오. 때때로 디버거는 속도가 느려서 단계를 밟을 때 궁금해합니다. 기계를 계속 사용할 수 있고 마우스를 움직이지 않으면 도움이 될 수 있습니다.
디버깅하는 동안 코드를 수정할 수있는 경우 :
처럼:
bool isLessThan5 = a < 5;
bool isGreaterThan10 = a > 10;
if ( isLessThan5 || isGreaterThan10 )
{
// more code here
}
대신에:
if ( a < 5 || a > 10 )
{
// more code here
}
어떤 이유로 든 모든 것을 디버깅 할 수없는 경우 동료와 "고무 덕"하는 법을 배우십시오. 때로는 설명하는 행동이 빛을 발산합니다. (OK, 아마도 이것이 주제 질문에 정확하게 해당되지는 않지만 언급을 보증하기에 충분하다고 생각합니다)
다른 사람들이 작성한 코드를 유지 관리하는 데 지난 22 년의 대부분을 소비 한 것에 근거한 두 가지.
작성하려는 버그의 종류를 이해하십시오.
예를 들어, 나는 매우 세심한 코더이므로 코드가 컴파일되면 일반적으로 사소한 버그가 없습니다. 그래서 내 버그는 스레드 교착 상태와 같은 이상한 복잡한 경향이 있습니다. 반대로, 나는 주로 사소한 버그를 작성하는 친구가 있습니다 .C ++ for 루프의 끝에 세미콜론이 있으므로 다음 줄은 한 번만 실행됩니다.
다른 사람들이 같은 종류의 버그를 작성한다고 가정하지 마십시오.
나는 버그가 정말 미묘한 이상한 일이라고 가정하고 친구가 내 어깨 너머로보고 "가서 세미콜론?" 몇 년이 지난 후, 나는 다른 사람들의 코드를 볼 때 사소하고 거칠지 않은 과일을 먼저 먹습니다.
도구를 아십시오. 예를 들어 Visual Studio의 디버거에는 중단 점과 유사한 TracePoints 라는 멋진 기능 이 있지만 코드를 중지하는 대신 추적 출력을 디버그 출력에 삽입합니다.
디버거 사용법에 대한 책을 읽거나 수업을 듣는 것이 좋습니다. 나는 두 개의 수업을 들었고 John Robbins가 쓴 디버거로서의 효과에 큰 영향을 미치는 몇 권의 책을 읽었습니다.
자동화 된 단위 테스트 및 기타 유형의 통합 및 기능 테스트를 작성하십시오.
자동화 된 테스트가 많을수록 디버거에 소비하는 시간이 줄어 듭니다.
또한 우수한 설계-SOLID 원칙. 작고 집중적 인 클래스를 작성하고 상속보다 컴포지션을 선호하고 중복을 제거하는 경우 코드를 항상 쉽게 디버깅 할 수 있습니다.
잘 설계된 코드는 제대로 디자인되지 않은 다른 버그 세트를 생성한다는 것을 알았습니다. 일반적으로 잘 설계된 코드는 쉽게 찾고, 재현하고, 수정하는 버그를 생성합니다.
예외는 (그리고 항상 존재합니다) 멀티 스레딩 코드입니다 :-)
Andreas Zeller의 소중한 프로그램 : 프로그램 실패 : 시스템 디버깅 안내서을 확인하십시오 . 많은 기술, 이론 및 도구를 소개하며 그 중 일부는 연구의 최첨단에 있습니다.
이 책의 슬라이드는 온라인에서 볼 수 있지만 책 자체를 읽기가 더 쉽다는 것을 알았습니다.
이 책은 디버깅을 시작하고 과학적으로 더 생각하게하는 데 도움이되지만 연습을 대신 할 수는 없습니다. 성능이 크게 향상되기 전에 10 년 동안 쓰고 디버깅해야 할 수도 있습니다. 나는 여전히 유닉스에서 30 년 동안 프로그래밍을해온 선임 개발자들이 몇 분 안에 모호한 멀티 스레딩이나 병렬 버그를 발견 한 것을보고 Sun에서 턱을 떨어 뜨린 것을 기억한다. 경험이 중요합니다!