intelliJ 자바 어플리케이션 디버깅하기

2019. 12. 31. 11:34 IDE Tool/IntelliJ IDEA

https://www.jetbrains.com/help/idea/2016.2/tutorial-debugging-your-first-java-application.html


디버깅을 하기에 앞서 이전 게시물에서는 HelloWorldApp을 만들어보았다.

출력문 하나만으로는 디버깅을 실습하기 조금 곤란하니 기존 소스코드에 1줄의 출력문을 더 추가해주자.



System.out.println("it's me!");

라는 출력문을 기존 소스코드 뒤로 추가하여 총 2번의 출력을 하도록 만들었다.


1. Putting breakingpoints

디버깅을 하기 위해서는 Breakingpoints를 먼저 설정해야한다.

breakingpoint 는 코드가 돌아가다 멈추는 지점이라고 생각 할 수 있다.

즉 프로그램이 실행되는 중에 내가 지정한 breaking point에서 프로그램을 멈추고 현재 프로그램의 상태를 알 수 있다.



위 캡쳐에서 빨간색으로 표시를 한 8,9 옆에 공간을 마우스로 클릭을 해보자




클릭을 하면 위 캡쳐와 같이 붉은색의 동그라미 표시가 생기게 되고, 다시 클릭을 하면 사라지게 된다. 이 붉은색 동그라미 표시가 8번 9번 라인에 breakpoint를 표시한것이다. 단축키를 사용할 경우 8번 라인에 커서가 가있는 상태로 (CTRL+F8)을 누르면 8번 라인에 breakpoint를 표시 할 수 있다.


표시해 놓은 breakpoint 위에 마우스 우클릭을 하거나 (SHIFT+CTRL+F8)을 누르면 아래와 같은 dialog를 볼 수 있다.




이 dialog 하단부에 보이는 More을 누르거나 한번더 (SHIFT+CTRL+F8)을 누르면 아래보이는 창과 같이 더 많은 정보를 볼 수 있는 창을 볼 수 있다.




이 창을 통해 설정된 모든 breakpoint를 탐색 할 수 있고, 여러 설정을 확인/수정 할 수 있다.


2. Starting a debugger session


(1. Putting breakpoints)를 통해서 breakpoint를 추가했으니, 이제 디버깅을 할 수 있다.



소스코드 좌측 6,7번 옆에 있는 RUN 아이콘을 누르면 위와 같은 창이 보인다.




IntelliJ 우측 상단을 봐도 같은 모양의 아이콘들이 보인다.



여기서 'HelloWorld.main()'은 default로 설정된 이름이다. 바꾸고 싶다면 상단 메뉴바에서 RUN>Edit Configuration 또는 우측 상단 선택창에서 Edit Configuration으로 이동해 설정을 변경 할 수 있다.




3. Stepping through the statements directly


이제 Debug 'HelloWorld.main()'을 클릭해서 디버깅을 진행해보자.


처음 HelloWorld를 실행했을때는 소스코드가 컴파일이 되고 IntelliJ 하단에 바로 "Hello World!!"가 출력되었지만, 

Debug를 선택했다면 컴파일을 하고 난 후 어플리케이션이 진행을 하다 첫번째  breakpoint에서 정지를 하고 화면이 아래와 같이 변할것이다.


소스코드가 보이는 창을 보면 8번째 줄이 선택되어있는 것을 볼 수 있다. 이것이 의미하는 것은 어플리케이션이 8번 라인에 표시된 breakpoint까지 진행을 하였고, 출력문 앞에서 멈춰있다는 것을 의미한다.


그리고 IntelliJ창 하단부에 이전에는 없던 새로운 칸이 생겼을것이다. 이 창이 Debug tool window이다(아래 캡쳐 된 부분).


 

이 창에서는 디버깅을 하는데 필요한 정보들과 툴바를 제공해준다.

이제 이 Debug tool window를 이용하여 본격적으로 디버깅을 해보자.


8번 라인 앞에서 멈춰있는 어플리케이션을 진행시키기 전에 Debug tool window창 상단에 보이는 Console 탭을 눌러보자.


버튼을 눌러 Console 탭으로 이동을 하였으면, 아직 소스코드에 입력된 두개의 출력문이 모두 실행되지 않은 것을 볼 수 있다.

( Hellow world 와 It's me 모두 출력이 안된 상태이다.)

8번 라인앞에 정지해있는 어플리케이션을 진행시키려면 

이렇게 생긴 step over 버튼을 누르거나 단축키 (F8) 를 누르면 된다.





 step over를 한번 누르고 나면 위 캡쳐 처럼 첫번째 출력문이 실행되고 다시 프로그램이 정지해있는 것을 볼 수 있다. 여기서 한번 더 step over를 누르면 아래와 같이 두번째 출력문 까지 실행이 되게 된다.



마지막으로 한번 더 step over를 누르게 되면 디버깅이 종료되게 된다.


4. Stepping through the method calls

다음으로 조금 더 복잡한 방법을 알아보고, println() 출력문 안으로 들어가보자.

종료된 디버깅을 다시 시작해보자.




Debug tool window에서 좌측 상단에 보이는 벌레버튼을 클릭하면 최근에 진행했던 디버깅를 다시 진행 할 수 있다.


어플리케이션은 이전과 같이 첫번째 breakpoint 앞에서 멈춘다. 

이전에 디버깅을 진행할때는 step over(F8) 를 눌렀지만, 이번에는 

force step into 

(SHIFT+ALT+F7)을 눌러본다.




force step into 를 하게되면 위와 같은 화면으로 넘어가게 될것이다. 이 화면은 IntelliJ가 디버그를 위해 library class 인 PrintStream.java의 println()함수의 내부로 이동 한 것을 보여준다. 화면에 보이는 x: "Hello World!!" 는 지금 파라메터로 들어와있는  String x 가 "Hello World!!" 라는 것을 알려준다.

여기서 

step out 

 (SHIFT+F8)을 누르면 다음 breakpoint로 이동하게 된다. 

위에서 했듯이 다시 F8을 몇번 누르면 프로세스가 종료되는 것을 확인 할 수 있다.


아직은 출력문만 사용해서 디버깅에 대해서 당장은 이해가 되지 않을 수 있지만, 공부를 하다 보면 자바에서 모두가 흔히 만나게 되는 NullPointerException을 만나다 보면 여기서 본 디버깅의 방법이 왜 필요한지 느끼게 될것이다.


p.s. 작성자는 mac을 이용하지만 window 단축키로 작성을 하고 있어서, 오류가 있을 수 있습니다. ㅠㅠ


출처 : https://chunghyup.tistory.com/10