기존 코드를 디버깅하는 기능을 향상시키는 방법 [닫기]


29

실무 세계의 일반적인 작업은 기존의 버그 코드를 처리하는 것입니다. 디버거로서의 기술을 향상시키기위한 몇 가지 팁은 무엇입니까?



2
답변을 위해 원저자에게 워터 보드를 제공하십시오.
Job

답변:


32

아무것도 가정하지 마십시오

종종 "오, 나는이 코드가 무엇을하고 있는지 잘 알고있다"고 말하고 싶은 유혹을 느낀다. 하지마 모든 가정을 테스트하고 모든 것을 신중하게 살펴보십시오.


2
+1. 전혀. 당신이 알고 있다고 생각한 것들이 당신에게 속임수를 쓰는 방법에 놀랄 준비를하십시오.
aufather

작동 나를 위해 :)
setzamora

3
다른 사람의 코드를 디버깅하는 것은 많은 시간을 낭비하고 생산성을 떨어 뜨리는 방법이지만 그 방법입니다. 다른 사람의 버그를 해결하는 것이 실제로 의미가있는 유일한 시간은 그들이 남은 시간입니다. 증오 증오 증오 증오 코디네이터가 객관적인 코드를 훑어 본 다음 적시에 진행하기 위해 질문을하고 기존 코드 기반을 배우는 기술 향상에 대한 강의를합니다. 대자연을 연구하는 것과는 달리 인간이 유발 한 문제를 해결하는 것은 거의 재미가 없습니다. 적어도 나는 대답을 얻는다. 내가 더 좋고 버그가 적기 때문에 반대 상황은 발생하지 않습니다.
Job

1
@ 잡 : ... 좋아? 이 댓글을 게시물에 남기려 했습니까? :)
Adam Lear

이! 이상한 문제를 디버깅하고 코드가 제대로 보이는 경우 작은 코드를 맹목적으로 신뢰하는 것은 어리석은 일입니다.
Dan

7

점진적으로 테스트 .

코드에서 우선 깊이 들어가서 가장 작은 모듈에서 점진적으로 올라 가면서 테스트하십시오. 이러한 방식으로 문제의 정확한 위치를 파악하려고 너무 많은 스트레스를받지 않습니다.

또한 점진적으로 움직이기 때문에 한 번에 적은 코드에 영향을 미친다는 것을 의미합니다. 때로는 무언가를 고치는 데 문제가있어 다른 많은 것들이 깨질 수 있습니다. 나는 내가 엉망이되었을 때 이것을 가르쳐 주면서 내 상사에게 신용을 제공합니다.


4

나누고 정복하는 것이 좋습니다. 문제가 존재하는 가시적 인 입력 (사용자 입력 / 네트워크 이벤트 ...)과 출력 (로그, 사용자에게 출력, 아웃 바운드 네트워크 메시지 ...)을 식별하십시오. 상당한 크기의 청크 또는 그 사이에 중요한 부분에 인쇄물을 넣고 코드의 버그 위치를 좁히십시오.

버전 제어 코드에 대한 회귀의 경우에도 분할 및 정복이 매우 효과적입니다. 두 가지 빌드를 찾으십시오-하나는 예상대로 작동하고 다른 하나는 회귀와 함께 작동합니다. 잠재적 인 용의자로서 많은 체크인이 남을 때까지 간격을 좁히십시오.


4

이진 버그 절단 대신 양식으로 테스트를 작성하십시오.

  • 주어진...
  • 언제...
  • 배고 있다...

앱의 기능에 대해 실제로 알고있는 것과 실제라고 생각하는 것을 확인합니다.

대부분의 IDE를 사용하면 메소드를 쉽게 추출하고 xUnit 테스트 스텁을 생성 할 수 있습니다. 그것을 활용하십시오.

왜 디버그를 뿌리지 않습니까? 완료된 후에는 해당 작업의 많은 부분을 취소하고 상당한 양의 디버그를 삭제해야합니다. 테스트를 작성할 때 디버깅은 향후 버그를 예방하고 감지하는 데 도움이됩니다.


2

계속 디버깅하십시오. 많이 디버깅하면 향상됩니다.


절대적으로 디버깅은 그 자체로, 특히 다른 사람들의 코드를 디버깅하는 것입니다.
Gratzy

2

다른 사람들이 말했듯이-아무것도 가정하지 마십시오. 코드를 작성한 경우 특히 그렇습니다. 다른 코드를 디버깅 할 때는 코드가 처음이거나 코더를 신뢰하지 않기 때문에 속도가 느려질 수 있습니다. 자신의 코드를 디버깅 할 때 코드를 올바르게 작성했다고 가정하기가 너무 느리면 속도가 느려집니다!

실제 디버깅 프로세스 :

  • 아직 존재하지 않는 경우 단위 테스트를 작성하십시오.
  • 적절한 로깅이 없으면 추가하십시오.
  • 그런 다음 디버깅을 사용하십시오.

디버거를 사용하는 것보다 단위 테스트를 추가하고 먼저 로깅하는 것이 더 효율적입니다. 또한 향후 버그를 도입하지 않도록 단위 테스트를 수행하면 로깅을 통해 향후 세션 디버깅에 도움이됩니다.


1

작은 코드 조각을 단계별로 진행하기 전에 결과를 정확하게 결정할 수 있는지 확인하십시오. 이것은 BTW에 투표 한 것으로 생각하지 않는 얼굴에 날아가는 경향이 있지만 경험을 쌓으면 볼 곳을 좁히는 데 도움이 될 수 있습니다.

이것은 사소한 것처럼 들리지만 디버거의 뉘앙스를 배우고 단축키를 배우십시오. 때때로 디버거는 속도가 느려서 단계를 밟을 때 궁금해합니다. 기계를 계속 사용할 수 있고 마우스를 움직이지 않으면 도움이 될 수 있습니다.

디버깅하는 동안 코드를 수정할 수있는 경우 :

  • 사전 및 사후 조건 주장을 고려하십시오. 때로는 코드 대신 단계적으로 넘어갈 수 있습니다.
  • 복잡한 표현을 가진 if 문에 대해서는 무언가를 고려하십시오 (일부는 찡그림 일지 모르지만 그것은 나를 위해 작동합니다)

처럼:

bool isLessThan5 = a < 5;
bool isGreaterThan10 = a > 10;
if ( isLessThan5 || isGreaterThan10 )
{
   // more code here
}

대신에:

if ( a < 5 || a > 10 )
{
   // more code here
}

어떤 이유로 든 모든 것을 디버깅 할 수없는 경우 동료와 "고무 덕"하는 법을 배우십시오. 때로는 설명하는 행동이 빛을 발산합니다. (OK, 아마도 이것이 주제 질문에 정확하게 해당되지는 않지만 언급을 보증하기에 충분하다고 생각합니다)


1
하위 조건의 이름 지정에는 한 단계 더, 즉 조건이 무엇인지 알아낼 때 이름의 리팩토링이 더 필요합니다. if (tooCloseToHydrant || overTheBrink) { 나중에 더 배우면 될 수 있습니다 .

1

다른 사람들이 작성한 코드를 유지 관리하는 데 지난 22 년의 대부분을 소비 한 것에 근거한 두 가지.

작성하려는 버그의 종류를 이해하십시오.

예를 들어, 나는 매우 세심한 코더이므로 코드가 컴파일되면 일반적으로 사소한 버그가 없습니다. 그래서 내 버그는 스레드 교착 상태와 같은 이상한 복잡한 경향이 있습니다. 반대로, 나는 주로 사소한 버그를 작성하는 친구가 있습니다 .C ++ for 루프의 끝에 세미콜론이 있으므로 다음 줄은 한 번만 실행됩니다.

다른 사람들이 같은 종류의 버그를 작성한다고 가정하지 마십시오.

나는 버그가 정말 미묘한 이상한 일이라고 가정하고 친구가 내 어깨 너머로보고 "가서 세미콜론?" 몇 년이 지난 후, 나는 다른 사람들의 코드를 볼 때 사소하고 거칠지 않은 과일을 먼저 먹습니다.


이동하는 것이 있는지 확인하기 위해 코드를 다시 포맷합니까?

@ Thorbjørn : 코드의 소유권을 얻은 경우 가독성을 향상시키기 위해 코드를 작성하지만 오타는 찾지 않습니다. 재미있는 아이디어!
밥 머피

당신은 그것을 저지를 필요가 없습니다. 무슨 일이 일어나는지보십시오. 체크인시 코드를 자동으로 다시 포맷해야하는 정책을 시행 할 것을 강력히 권장 할 수 있습니다.

@ Thorbjørn : 그렇게하고 싶습니다. 코드 "prettifier"로 무엇을 추천하십니까? 나는 주로 리눅스와 맥에서 일한다.
밥 머피

두 위치 모두에서 사용할 수있는 Eclipse를 사용하며 Java 편집기에는 파일을 저장할 때마다 수행 할 작업을 지정할 수있는 저장 조치가 있습니다. 옵션 중 하나는 소스를 포맷하는 것입니다. 우리는 소규모 팀이므로 더 조사하지 않았습니다. 보다 숙련 된 팀은 소스 제어 시스템에서 사전 커미트 후크를 허용하므로 형식이 잘못 지정된 소스 커밋을 거부 할 수 있습니다. 매우 효율적입니다.

1

도구를 아십시오. 예를 들어 Visual Studio의 디버거에는 중단 점과 유사한 TracePoints 라는 멋진 기능 이 있지만 코드를 중지하는 대신 추적 출력을 디버그 출력에 삽입합니다.

디버거 사용법에 대한 책을 읽거나 수업을 듣는 것이 좋습니다. 나는 두 개의 수업을 들었고 John Robbins가 쓴 디버거로서의 효과에 큰 영향을 미치는 몇 권의 책을 읽었습니다.


0

코드가 수행하려는 작업을 기능적으로 이해하십시오. 완전한 그림을 모르는 경우 (모든 테스트 사례가이 코드를 통과해야 함) 새로운 버그를 도입하지 않고 제대로 디버깅하기가 어렵습니다.


0

자동화 된 단위 테스트 및 기타 유형의 통합 및 기능 테스트를 작성하십시오.

자동화 된 테스트가 많을수록 디버거에 소비하는 시간이 줄어 듭니다.

또한 우수한 설계-SOLID 원칙. 작고 집중적 인 클래스를 작성하고 상속보다 컴포지션을 선호하고 중복을 제거하는 경우 코드를 항상 쉽게 디버깅 할 수 있습니다.

잘 설계된 코드는 제대로 디자인되지 않은 다른 버그 세트를 생성한다는 것을 알았습니다. 일반적으로 잘 설계된 코드는 쉽게 찾고, 재현하고, 수정하는 버그를 생성합니다.

예외는 (그리고 항상 존재합니다) 멀티 스레딩 코드입니다 :-)


0

작은 영역으로 좁혔지만 여전히 오류를 발견 할 수 없다면 디버거의 '코드 + 어셈블리보기'옵션을 사용해보십시오. "여기에 지점이 있어야합니다"또는 "낮은 단어 만 복사하는 이유는 무엇입니까?" 종종 코딩 오류를 찾아냅니다.


0

Andreas Zeller의 소중한 프로그램 : 프로그램 실패 : 시스템 디버깅 안내서을 확인하십시오 . 많은 기술, 이론 및 도구를 소개하며 그 중 일부는 연구의 최첨단에 있습니다.

이 책의 슬라이드는 온라인에서 볼 수 있지만 책 자체를 읽기가 더 쉽다는 것을 알았습니다.

이 책은 디버깅을 시작하고 과학적으로 더 생각하게하는 데 도움이되지만 연습을 대신 할 수는 없습니다. 성능이 크게 향상되기 전에 10 년 동안 쓰고 디버깅해야 할 수도 있습니다. 나는 여전히 유닉스에서 30 년 동안 프로그래밍을해온 선임 개발자들이 몇 분 안에 모호한 멀티 스레딩이나 병렬 버그를 발견 한 것을보고 Sun에서 턱을 떨어 뜨린 것을 기억한다. 경험이 중요합니다!


그들의 자동화 된 소프트웨어는 매우 흥미로워 보입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.