중단점 없이 디버깅하기

다른 언어: English Español Português 中文

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

중단점을 어디에 설정해야 할지 결정하는 것은 쉽지 않을 수 있습니다. 정확한 라인이 모호할 수 있거나, 특정 코드보다는 시간에 따라 프로그램을 일시 중지하는 것을 선호할 수도 있습니다.

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

Pause란 무엇인가?

프로그램 일시 중지 (Pause Program)는 IntelliJ IDEA의 디버거에서 프로그램을 임의적으로 주어진 시점에 중단할 수 있게 해주는 기능입니다. 게다가, 애플리케이션 코드를 알 필요조차 없습니다. 사실, 완전히 무시할 수도 있습니다!

디버거의 툴바에 있는 '프로그램 일시 중지' 버튼 디버거의 툴바에 있는 '프로그램 일시 중지' 버튼

프로그램을 일시 중지하려면 디버거의 툴바에서 프로그램 일시 중지 (Pause Program)를 클릭하면 됩니다. 그러면 프로그램은 그 중간에 무엇을 하든 주저 없이 바로 중단됩니다.

한계점

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

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

프로그램 일시 중지 (Pause Program)를 종류의 스레드 덤프 플러스 정도로 간주하는 것이 맞습니다. 기본적으로 변수와 스레드를 검사하는 것처럼 여전히 검사할 수 있습니다. 그러나, 표현식 평가 (Evaluate Expression)와 같은 보다 고급 기능들은 작동하지 않을 수 있습니다.

사용 사례

프로그램 일시 중지 (Pause Program)를 사용할 수 있는 방법은 무수히 많습니다. 자주 전통적인 중단점과 서로 바꿔 사용할 수 있습니다. 그러나, 프로그램 일시 중지 (Pause Program)가 더 적합한 접근법인 시나리오도 있습니다. 다음은 그중 몇 가지를 살펴보겠습니다.

반응하지 않는 앱

UI가 멈추면, 그것은 대부분 UI 스레드가 차단되었기 때문입니다.

차단된 UI 스레드의 스택은 현재 실행 중인 메소드를 보여줍니다 차단된 UI 스레드의 스택은 현재 실행 중인 메소드를 보여줍니다

이 경우에 프로그램 일시 중지 (Pause Program)가 유용할 수 있습니다. 이 기능을 사용하면 반응하지 않는 애플리케이션을 일시 중지 하고 UI 스레드의 호출 스택을 검사할 수 있습니다. 이것만으로도 문제를 진단하는 데 충분합니다.

소스 코드 누락

앞서 언급했듯이, 프로그램 일시 중지 (Pause Program)는 소스 코드를 완전히 무시할 수 있게 해줍니다. 소스 코드가 누락되어 있을 수도 있겠죠. 이런 시나리오는 그리 흔하지 않지만, 마주하게 된다면, 중단점은 그리 도움이 되지 않을 것입니다.

이럴 때 프로그램 일시 중지 (Pause Program)가 필요한 경우가 있습니다!

hehe cat meme

Locks

데드락이나 라이브락과 같은 동기화 문제가 의심될 경우, 프로그램 일시 중지 (Pause Program)는 문제를 일으키는 정확한 스레드와 락을 찾는 데 도움이 될 수 있습니다.

스레드 목록은 어떤 스레드가 데드락에 빠졌는지 보여줍니다 스레드 목록은 어떤 스레드가 데드락에 빠졌는지 보여줍니다

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

비밀 단계 수행 트릭

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

'일시 중지 후에는 메소드를 평가할 수 없습니다'라는 오류 메시지 '일시 중지 후에는 메소드를 평가할 수 없습니다'라는 오류 메시지

그러나, 이 제한에 대한 해결책이 있습니다.

애플리케이션을 일시 중지한 후, 어떤 단계 수행 행동을 수행하면 됩니다. 스텝인투 (Step Into) 또는 스텝오버 (Step Over) 둘 중 어느 것이든 상관없습니다. 일단 그것이 끝나면, 중단점을 사용하여 애플리케이션을 일시 중지하는 것과 비슷한 일반적인 디버깅 세션에 들어갈 수 있게 됩니다. 이제 모든 고급 기능이 열려있습니다!

결론

오늘은 이 정도입니다! 이 팁과 트릭을 유용하게 사용하기를 바랍니다.

Java 디버깅에 대해 특정 주제를 다뤄달라는 것이 있다면, 망설이지 말고 연락해 주세요! 여러분의 피드백은 가장 흥미로운 내용을 우선적으로 발행하는 데 도움이 될 것입니다.

all posts ->