IntelliJ IDEA Tutorials

디버거 배우기: 중단점 없이 디버그하기

Read this post in other languages:

일반적인 디버그 시나리오에서는, 디버거가 프로그램을 언제 중단해야 하는지 알려주기 위해 중단점을 설정하게 됩니다. 중단점은 일반적으로 추가 조사를 시작하기 위한 시점과 일치합니다.

중단점을 어디에 설정해야 할지 결정하는 것은 쉽지 않을 수 있으며, 정확한 줄이 불분명한 상황이 있을 수도 있고, 특정 코드 보다는 타이밍에 따라 프로그램을 일시 중지하는 것을 선호할 수도 있습니다.

이 글에서는 IntelliJ IDEA의 Pause Program(프로그램 일시 중지) 기능에 대해 알아보겠습니다. 이 기능은 앞서 설명한 시나리오를 포함해 어떤 상황에서든 매우 강력할 수 있는 잘 알려지지 않은 디버그 기술입니다. 이 기능의 사용 사례와 한계점, 그리고 숨겨진 단계별 실행 요령을 살펴보겠습니다.

Pause Program(프로그램 일시 중지)란 무엇인가요?

프로그램 일시 중지(Pause Program)는 IntelliJ IDEA의 디버거에서 프로그램을 임의적으로 주어진 시점에 중단할 수 있게 해주는 기능으로 애플리케이션 코드가 익숙하지 않은 사람도 사용할 수 있습니다. 사실, 완전히 몰라도 상관없습니다.

디버거 툴바에 있는 일시 정지 버튼

프로그램을 일시 중지하려면 디버거의 툴바에서 Pause Program(프로그램 일시 중지)을 클릭하면 됩니다. 그러면 프로그램은 어떤 작업을 하고 있든 바로 중단됩니다.

제한 사항

처음 보았을 때, 일시 중지된 프로그램은 중단점에서 중단된 프로그램과 똑같아 보일 수 있습니다. 그러나, 이것은 일정 부분까지만 사실입니다.

디버거가 중단점이 아닌 Pause를 사용해 앱을 중단해도 같아 보임

Pause Program(프로그램 일시 중지)을 일종의 향상된 스레드 덤프로 간주하는 것이 맞을 수 있습니다. 평소와 마찬가지로 변수와 스레드를 검사하는 것처럼 검사하는 것은 가능하지만, Evaluate Expression(표현식 평가)와 같은 일부 고급 기능은 작동하지 않을 수 있습니다.

사용 사례

Pause Program(프로그램 일시 중지)을 사용할 수 있는 방법은 무수히 많으며, 이는 전통적인 중단점과 종종 상호 교환적으로 사용할 수 있습니다. 그러나, 프로그램 일시 중지 (Pause Program)가 더 적합한 접근법인 시나리오도 있습니다. 그중 몇 가지를 살펴보겠습니다.

응답하지 않는 앱

만약 UI가 멈추었거나 반응하지 않는다면, 대부분의 경우 그 이유는 UI 스레드가 차단되었거나 시간이 많이 걸리는 작업으로 바쁘기 때문입니다.
The stack of the blocked UI thread shows what method it is currently executing
이 두 가지 경우 모두 Pause Program이 유용할 수 있습니다. 이 기능을 사용하면 응답하지 않는 애플리케이션을 일시 중지하고 UI 스레드의 호출 스택을 검사할 수 있습니다. 이것만으로도 문제를 진단하는 데 충분합니다.

소스 코드 누락

앞서 언급했듯이, Pause Program을 사용하면 간단히 소스 코드를 무시할 수 있습니다. 이는 소스 코드가 누락된 경우나, 소스 코드를 보지 않고 디버그를 하는 경우에 유용합니다. 물론 이런 시나리오는 그리 흔하지 않지만, 만약 이런 일이 있다면 중단점은 그다지 도움이 되지 않을 겁니다. 이때 Pause Program등장합니다!

Locks

교착 상태나 라이브락과 같은 동기화 문제가 의심될 경우, 문제를 일으키는 정확한 스레드와 락을 찾는 데 Pause Program이 도움이 될 수 있습니다.
스레드 목록은 어떤 스레드가 교착 상태에 빠졌는지 보여줍니다.

이 경우, 프로그램을 일시 중지하고 스레드 목록을 검사합니다. 그러면 어떤 스레드가 차단되었는지 보여줄 것입니다. 실행 지점으로 이동하면, 잠긴 중요한 영역도 확인할 수 있습니다. 이 정보가 해결책을 찾는 데 도움이 될 수 있습니다.

단계별 실행 요령

앞서 말했듯이, Pause Program은 실제로 일부 고급 디버거 기능에 대한 접근을 제한합니다. 애플리케이션이 일시 중지된 상태에서 특정 기능을 사용하려고 시도하는 경우, Cannot evaluate methods after Pause action(일시 정지 액션 이후 메서드를 평가할 수 없음) 에러 메시지를 볼 수 있습니다.
Cannot evaluate methods after Pause action(일시 정지 액션 이후 메서드를 평가할 수 없음)이라고 표시되는 오류 메시지

그러나, 이 제한에 대한 해결책이 있습니다.
애플리케이션을 일시 중지한 후, 단계별 실행을 하면 됩니다. 간단하게 Step Into(스텝인투) 또는 Step Over(스텝오버)를 하면 됩니다. 이 작업이 완료되면, 중단점을 사용하여 애플리케이션을 일시 중지하는 것과 비슷한 일반적인 디버깅 세션에 들어갈 수 있게 됩니다.
모든 고급 기능을 사용할 수 있게 됩니다!

결론

오늘은 여기까지입니다! 오늘은 이 정도입니다! 이 글이 여러분에게 도움이 되길 바랍니다.
Java 디버그에 대해 다루었으면 하는 주제가 있다면 언제든 알려 주세요! 여러분의 의견을 바탕으로 사용자가 가장 흥미로워하는 내용을 다룰 수 있도록 하겠습니다.

게시물 원문 작성자

Igor Kulakov

Igor Kulakov

image description

Discover more