코드 분석만으로는 불충분한 경우

  • 코드 읽는 법이 시 읽는 법과 다른 점
    • 코드는 선형적이지 않다. 코드는 한 라인 한 라인 그냥 읽는 대상이 아니다.
    • 시와 달리 코드는 항상 모든 사람에게 동일한 의미를 지닌다.
  • 아무리 작은 코드 조각이라도 커맨드를 더 자세히 들여다봐야 할 때가 많다.
    • 어떤 커맨드는 조사를 생략해서 전체 프로세스를 단순하게 가져갈지, 아니면 프로세스가 더 복잡해지더라도 자세히 살펴보고 개별 커맨드를 확실하게 이해할지 선택해야 한다.

디버거를 이용한 코드 조사

  • 디버거를 사용하면 조사 프로세스가 간소화된다.
    • 특정 스텝에서 잠깐 실행을 멈추고 각 커맨드를 본인 페이스에 맞게 수동 실행할 수 있다.
    • 코드 읽기 경로상의 현재 위치와 출처를 표기함으로써 세부 정보를 일일이 다 기억하지 않아도 편리한 안내 지도 역할을 한다.
    • 변수에 어떤 값이 담겼는지 화면에 표시되어 코드 조사가 더 눈에 잘 띄고 쉽게 진행할 수 있다.
    • watcher로 즉석에서 원하는 동작을 바로 시험하거나 표현식을 평가할 수 있다.
  • 먼저, 코드를 읽어보고 이해가 되는 부분과 안 되는 부분을 파악하고, 이해가 안 되는 코드 라인에 브레이크포인트를 찍어 디버거를 실행한다.

실행 스택 트레이스란 무엇이고 어떻게 사용해야 할까?

  • 실행 스택 트레이스: 디버거가 중단시킨 코드 라인의 실행 경로를 나타내며, 이후 어디로 나아가야 할지 결정하는 데 도움을 준다.
  • 실행 경로에 감춰진 로직을 찾을 때 이 실행 스택 트레이스를 자주 활용한다.
    • 스프링이나 하이버네이트 같은 프레임워크를 사용하는 앱은 메서드의 실행 체인을 바꾸는 경우가 잦다.
    • 예시) aspect

디버거로 코드 탐색하기

  • 디버거로 코드를 탐색하는 세 가지 기본 기술
    • 스텝 오버: 동일한 메서드에서 다음 코드 라인으로 계속 실행한다.
    • 스텝 인투: 현재 라인에서 호출된 메서드 중 하나의 내부에서 실행을 계속한다.
    • 스텝 아웃: 조사하던 메서드를 호출한 메서드로 실행을 되돌린다.
  • 코드의 작동 방식을 알고 싶다면 일단 스텝 오버로 시작하는 것이 좋다.
    • 스텝 인투를 할 때마다 조사 플랜이 새로 열리면 전체 프로세스가 점점 복잡해진다.
    • 대부분 코드 라인을 스텝 오버하며 아웃풋을 관찰하는 것만으로도 대략 어떤 일을 하는지 짐작할 수 있다.

디버거로도 충분하지 않다면

  • 디버거를 사용하는 것이 옳은 접근 방식이 아닌 경우
    • 코드의 어느 부분이 아웃풋을 내는지 모르는 채 아웃풋 문제를 조사한다.
      • 앱 프로파일링이나 스터빙 등은 디버거로 조사를 시작할 위치를 파악할 때 많이 쓰는 기법이다.
    • 성능 문제를 조사한다.
      • 프로파일링과 로깅 기법을 사용하면 해결의 실마리를 찾는 데 도움이 된다.
    • 앱 전체가 실패한 크래스를 조사한다.
      • 디버거는 실행 중인 앱을 관찰하는 도구라서 앱 자체가 실행이 안 된다면 무용지룸링다.
      • 상황에 따라 감사 로그를 활용하거나 스레드 또는 힙 덤프를 수집하여 조사해야 한다.
    • 멀티스레드 구현체를 조사한다.
      • 멀티스레드 기반의 구현체는 디버거 같은 도구가 간섭을 일으켜 영향을 받기가 쉽고 하이젠버그 효과가 일어나면서 디버거를 사용할 때와 사용하지 않을 때의 동작이 달라진다.
      • 디버깅, 모킹, 스터빙, 프로파일링 등의 다양한 기술을 익혀야 한다.