더 나은 'printf' 디버깅
다른 언어: English Español Português 中文
가장 보편적인 디버깅 기법 중 하나인, ‘printf’ 디버깅은 대부분의 사람들이 첫 프로그램을 작성할 때 직관적으로 배우기 때문에 특히 인기가 있습니다.
‘printf’ 디버깅은 특별한 도구가 필요하지 않기 때문에 접근성이 좋습니다. 디버거가 무엇인지 알기 전에, 첫 번째 버그를 다루면서, 콘솔에서 실행을 따라가기 위해 프로그램이 단계별로 변수를 출력하도록 하는 것이 당연하게 떠오릅니다.
가장 기본적인 디버깅 기법 중 하나임에도 불구하고, 경험 많은 개발자들도 많이 사용합니다. 서브 최적 루틴, 불일치 상태, 다중 스레딩 문제 등 모든 유형의 문제를 조사하는 데 도움이 될 수 있습니다.
이미 언급했듯이, 이 기법은 IDE와 같은 특별한 도구를 사용하지 않아도 됩니다. 그러나, 하나를 사용하고 있다면 프로그램 상태를 로그하는 데 훨씬 효율적으로 만들 수 있습니다.
이 글에서는 IntelliJ IDEA의 기능을 보여줍니다. 다른 IDE에서는 이러한 기능이 있거나 없을 수 있습니다. 다른 도구를 사용하고 있다면, 이 기능들이 거기에도 있는지 확인하기 위해 해당 문서를 확인하는 것을 고려하십시오.
라이브 템플릿
IntelliJ IDEA는 가장 일반적인 디버그 로깅 패턴을 위한 라이브 템플릿을 제공합니다. 디버그 로깅을 위한 라이브 템플릿을 사용하려면 해당 단축 표현을 입력하고 Tab을 누릅니다. IntelliJ IDEA는 print 문을 생성하고 캐럿에 삽입합니다.
몇 가지 예를 살펴보겠습니다.
메소드 매개변수 로깅하기
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {
// 여기에 'soutp'를 입력하고 Tab을 누르세요
return null;
}
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {
System.out.println("in = " + in + ", mask = " + mask + ", newColor = " + newColor);
return null;
}
값 로깅하기
public static double coolMethod(double parameter) {
double a = Math.random();
double b = Math.random();
// 여기에 'soutv'를 입력하고 Tab를 누르고 값을 선택하세요
return a * b * parameter;
}
public static double coolMethod(double parameter) {
double a = Math.random();
double b = Math.random();
System.out.println("b = " + b);
return a * b * parameter;
}
메소드 입장 로깅하기
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {
// 여기에 'soutm'을 입력하세요
return null;
}
public static BufferedImage recolor(BufferedImage in, BufferedImage mask, int newColor) {
System.out.println("ImageUtils.recolor");
return null;
}
로깅 브레이크포인트
printf를 사용하는 디버깅의 한 가지 단점은 수동 관리의 오버헤드를 도입한다는 것입니다. 빠르게 켜고 끌 수 없으며, 실수로 커밋하고 제품 환경에서 실행하고 싶지 않습니다.
이 때문에, 디버깅을 위해 무언가를 로그해야 하는 경우, 관리하기가 훨씬 쉬운 로깅 브레이크포인트를 사용하는 것을 권장합니다.
로깅 브레이크포인트를 설정하려면 Shift를 누른 채로 거터를 클릭합니다. 일반 브레이크포인트와 달리, 프로그램의 실행을 중단하지 않고 대신 콘솔에 출력합니다.
기본적으로, 프로그램이 이 행에 도달했음을 나타내는 메시지입니다. 브레이크포인트 설정의 평가 및 로그 (Evaluate and log) 체크박스 근처의 옵션을 사용하면 현재 스택 추적을 로깅하거나 사용자 지정 표현식의 결과를 로깅하는 것을 선호할 수 있습니다.
로깅 표현식에 대해 주의하세요. 부작용을 일으키는 것을 평가하면 새로운 버그나 예상치 못한 동작의 원인이 될 수 있습니다. 또한, 핫 코드에서 사용될 때, 프로그램을 상당히 느리게 만들 수 있습니다.
로깅 브레이크포인트가 많아지면, 중단점 (Breakpoints) 대화 상자 (실행 | 중단점 보기 – Run | View Breakpoints)에서 추적하고 관리할 수 있습니다:
그들을 위해 사용자 지정 그룹을 생성할 수도 있습니다:
이를 통해 브레이크포인트를 중앙에서 관리할 수 있게 도와줍니다. 예를 들어, 특정 버그와 관련된 그룹을 만들어 나중에 저장할 수 있습니다. 문제가 해결되면 그냥 끄면 됩니다. 이렇게 하면 문제가 다시 발생하면 모든 것을 처음부터 다시 만들 필요가 없습니다. 그룹을 다시 켜기만 하면 됩니다.
자주 발생하는 이벤트 로깅하기
프로그램 실행 중에 많이 발생하는 이벤트의 경우, 각각의 이벤트를 모두 로깅하는 것은 과도할 수 있습니다. 이것은 단지 콘솔에 메시지를 채우는 것뿐만 아니라, I/O와 많은 상호 작용은 디버깅 세션을 상당히 느리게 만듭니다.
이런 이벤트의 경우, 통과 수 (Pass count) 기능을 사용하는 것이 유용할 수 있습니다. 이는 중단점 (Breakpoints) 대화 상자에서 접근할 수 있습니다.
통과 수 (Pass count)를 특정 값으로 설정하면, 해당 브레이크포인트는 n번째 히트마다만 발동하여 로깅이 성가시게 되는 것을 방지합니다.
요약
print 문을 삽입하든 로깅 브레이크포인트를 설정하든 디버깅을 위해, 현대 도구에는 디버깅 경험을 향상시키는 기능이 있습니다. 이 글을 통해, 이런 작은 팁들을 알게 되어 전체 과정이 더 즐겁게 만들 수 있게 되었기를 바랍니다.
디버깅 잘하세요!