나는 주로 System.out.println (sout) 디버거를 사용하는 프로 sout 디버거 사용자이다. 한참 고민해도 해결되지 않는 문제만 디버깅 모드를 사용하며, 디버깅 모드는 거의 사용하지 않는다. 그 이유는 디버깅 모드가 많은 정보를 보여주어 복잡하게 느껴지기 때문이다.
이번에 디버깅 사용법을 공부하면서 내가 원하는 정보를 빠르게 알아내고 효율적으로 사용하는 방법을 배웠다. 이를 통해 개발 시간이 단축되고, 효율적으로 개발할 수 있다는 선배 개발자들의 조언을 듣고 디버깅 모드에 익숙해지기 위해 노력할 예정이다.
디버그 모드
| 
—|—|
IntelliJ에서 디버그 모드를 사용하면 프로그램의 실행을 단계별로 조정할 수 있어 오류를 파악하기 용이하다.
디버거 모드 기능
- Resume: 다음 브레이크 포인트까지 실행을 계속한다.
- Step Over: 현재 라인의 다음 줄로 이동한다.
- Step Into: 메서드 내부로 들어가 상세한 로직을 확인한다.
- Step Out: 현재 메서드에서 실행을 마친 후 상위 레벨로 빠져나온다.
- Drop Frame: Step Out과 비슷하지만, 메서드 실행을 취소하고 빠져나온다.
- Run to Cursor: 브레이크 포인트 없이 커서가 위치한 지점까지 실행한다.
디버그 모드를 사용할 때 브레이크 포인트를 설정하면 코드 실행 중 특정 시점에서 멈추어 상태를 확인할 수 있다. 이를 통해 변수의 값이나 객체의 상태를 쉽게 점검할 수 있다.
조건부 브레이크 포인트(condition 설정)
브레이크 포인트는 코드 실행을 특정 지점에서 멈추게 하여 디버깅을 쉽게 돕는다.
반복문을 디버깅할 때, 특히 반복 횟수가 많으면 원하는 지점까지 도달하려고 여러 번 Step Over를 눌러야 하는 번거로움이 생길 수 있다.
이때, 조건부 브레이크 포인트를 설정하면 특정 조건에서만 코드가 멈춰, 시간을 절약할 수 있다.
브레이크 포인트를 우클릭하여 조건을 추가할 수 있으며, 이를 통해 특정 상황에서만 멈추도록 설정할 수 있다.
예를 들어, i==80과 같은 조건을 설정하면 해당 조건이 참일 때만 브레이크 포인트가 작동한다.
조건을 걸 경우, 브레이크 포인트에 ?가 생긴다. 그 후 i==80 경우 브레이크가 작동된다.

Evaluate와 Watch
Evaluate
디버깅 중에는 Evaluate 기능을 통해 현재 스코프에서 사용할 수 있는 메서드나 표현식을 실행해 볼 수 있다.
이는 특정 값을 직접 확인하거나 변수의 상태를 수정하는 데 유용하다. Shift + Enter를 눌러 여러 줄의 코드를 작성할 수도 있다.

Evaluate에서 실행한 코드는 실제 코드에 반영되므로 주의해야 한다.
Watch
또한 Watch 기능을 통해 특정 변수를 모니터링하고, 그 값이 어떻게 변화하는지를 실시간으로 추적할 수 있다. 이는 디버깅 중 중요한 변수를 지속적으로 확인하는 데 매우 유용하다.

Stack Trace 분석
디버깅 중 예외가 발생했을 때, Stack Trace는 예외가 발생한 지점을 파악하는 데 중요한 단서를 제공한다.
Stack Trace는 예외가 발생한 위치와 호출된 메서드의 목록을 나타내며, 이를 통해 예외가 발생한 경로를 추적할 수 있다.
CookingException: 라면을 끓일 수 없음: 불이 안 나옴
at DebuggingExample.boilRamen(DebuggingExample.java:25)
at DebuggingExample.startCooking(DebuggingExample.java:10)
at DebuggingExample.main(DebuggingExample.java:5)
Caused by: CookingException: 불이 안 나옴
at Stove.heatUp(DebuggingExample.java:40)
at DebuggingExample.boilRamen(DebuggingExample.java:23)
... 2 more
Caused by: CookingException: 가스가 없음
at Stove.heatUp(DebuggingExample.java:37)
... 3 more
- 예외 유형 및 메시지
- 예외가 발생한 종류와 그에 대한 설명을 나타냄.
CookingException: 라면을 끓일 수 없음: 불이 안 나옴
- 호출된 메서드의 목록
- 예외가 발생한 위치와 그 이전에 호출된 메서드들을 나열.
at DebuggingExample.boilRamen(DebuggingExample.java:25)
at DebuggingExample.startCooking(DebuggingExample.java:10)
at DebuggingExample.main(DebuggingExample.java:5)
- 원인 추적 (Caused by)
- 예외가 다른 예외로 인해 발생했음을 나타내며, 예외의 원인을 파악할 수 있도록 도와줌.
Caused by: CookingException: 가스가 없음
at Stove.heatUp(DebuggingExample.java:37)
- Suppressed Exception
- 해당 스레드에서 catch된 예외를 의미하며, 주로
try-with-resources구문에서 발생하는 예외를 표시할 때 사용된다.