같이 공부하는 개발자 친구와 얘기하는 도 중 디버깅 얘기가 나왔다.
이클립스를 사용할 때 DEBUG 버튼이 있던 걸 봤었다.
근데 디버깅.. 오류를 찾기 위해서 로그 레벨은 낮춰서 확인하는 줄 알았다.
위에있는 벌레 모양이 디버그 버튼이고 코드 옆에 10,12번 라인에 브레이크 포인트를 설정 했었다.
package debug;
import java.util.Arrays;
public class DebugTest01 {
static int[] arr = new int[10];
public static void main(String[] args) {
int dan = 5;
for(int i=0; i<10; i++) {
arr[i] = multi(i , dan);
}
System.out.println(Arrays.toString(arr));
}
static int multi(int num1, int num2) {
return num1 * num2;
}
}
위의 예제 말고 간단히 구구단 예제를 만들어서 넣었다.
버퍼리더나 스캐너를 통해서 값을 사용자에게 입력 받을 수 있지만 일단 알아보기 쉽게 하기 위해서 변수를 선언해서 밸류를 대입했다.
디버그 모드를 하면 레이아웃이 살짝 바뀐다.
그리고 오른쪽위의 Show Staic Vairables 옵션을 추가하면
Static 변수도 보인다.
현재 어떤 내용을 가지고 있는지 확인 가능
브레이크 포인터를 int dan = 5; 있는 곳에 넣었기 떄문에 아직 배열에 들어가 있지 않은 상태
왼쪽위에 step into 하고 step over이 있는데 이렇게 해서 라인마다 실행이 가능하고
그러면 dan이 생긴걸 볼 수 있고 그다음 i가 for문 0이 생긴다
12번 라인에서 이제 step into 하고 step over의 차이점을 알 수 있다.
step into를 클릭하면 mult(i , dan); 부분인 multi의 함수로 들어간다.
step into 를 하면 메서드가 리턴 됐고 맨 위에 mult() returned 0이 나와있다.
그럼 이제 arr[0] 에 0의 값이 할당이 된 것.
그럼 이제 for문에 의해서 1이 증가됨.
반복문이 하나하나 실행되는 것을 보여준다.
이제 여기서 step over 를 클릭하면 multi라는 메서드에는 들어가지 않고 반복문을 실행해준다.
변수값 위에 커서를 올려보면 지금 까지 실행된 값들이 들어가 있는 것을 확인할 수 있다.
또 이제 표현식(Expressions)에 표현식을 넣으면 값이 출력되는것을 볼 수 있다.
Expression은 내용이 초기화 되지 않는다.
Variables와 Expressions의 차이점은
일단 Variables의 값은 수정할 수 있지만 Expressions의 값은 수정할 수 없다.
브레이크 포인트를 잡고 우측 클릭하여 properties를 볼 수 있고, 또는 오른쪽에 BreakPoints에서 DebugTest를 클릭해서 볼 수 있다.
Hit count를 8로 두고 실행하면 i가 8번 실행되고 7에 찍혀있는 것을 확인할 수 있다.
i 부분에서 i == 8로 하면 i가 8일떄까지 실행시켜주고 그 값을 보여준다.
Expression에 테스트 해 본 결과 잘 나온것을 볼 수 있다.
Debug shell
디버그 쉘을 이용할 수 있다.
아래에 구문을 입력하고 실행을 누르면 재생되지 않는다!
구문을 모드 드래그 하고 실행시켜줘야 한다!
i라는 변수는 이미 위에서 사용중이므로 에러가 뜬다.
이렇게 j로 바꿔주고 지금 현재 실행된 값이 35까지이니깐
sum을 이용해서 구문을 입력하면 0~35 까지 실행된 값들이 더해진다.
그리고 멀티에 들어가서 받는 파라미터 값이 정확한지 확인하기 위해서
이렇게 하고 실행 옆에 있는 Display result of evaluating 를 클릭하면 (boolean) true로 볼 수 있다.
근데 이러한 구문을 계속해서 복붙해서 어디 메모장 같은데에 넣어놓고 쓰기 보단,
이걸 모니터링 하고 싶다면 expression에 들어가게 할 수 있다.
해당 버튼을 클릭하면 표현식이 들어간 것을 보고 num1의 값이 0과 10사이인지 모니터링 할 수 있다.
디버그 모드에서 다시 자바로 되돌릴 때
피보나치 수열에서 사용할 때
package debug;
public class DebugTest02 {
public static void main(String[] args) {
System.out.println(fibo(5));
}
public static int fibo(int n) {
if(n < 2) {
return n;
}else {
return fibo(n-1) + fibo(n-2);
}
}
}
실행되면서 메서드 스택이 잡히는 것을 확인할 수 있음
각각의 밸류가 나온다..
그리고 n이 4인 지점에서 다시 다른 동작을 하고 싶으면 Drop the frame을 클릭하면 된다.
디버깅을 해야하는 이유는 논리적 오류 또는 문법적 오류가 났을 때 찾을 수 있고,
로그로 항상 찾아왔는데 로그는 말 그대로 그냥 기록일 뿐이지 용도에 맞지 않다고 볼 수 있다.
'컴퓨터 지식' 카테고리의 다른 글
[SQLD] ROLLUP (0) | 2022.02.12 |
---|---|
[SQLD] 데이터 모델링의 이해 (0) | 2022.01.16 |
MySQL : 고급 (테이블, 인덱스 , 뷰) (0) | 2021.11.03 |
MySQL : 기본적인 것들 내장함수 등등 (0) | 2021.11.03 |
MySQL : 기본적인 것들 DML,DDL,DCL 등등 (0) | 2021.11.03 |