다음과 같은 기능이 있다고 가정 해 봅시다.
public void myStart()
{
for (int i = 0; i<10; i++) myFunction(i);
}
private int myFunction(int a)
{
a = foo(a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
//something gnarly here
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
이제 어떤 이유로 든 코드가 작동하지 않습니다. 아마도 오류가 발생했을 수 있습니다. 아마도 잘못된 값을 반환하거나 무한 루프에 빠졌을 수 있습니다.
첫해 프로그래머가 가장 먼저 콘솔로 출력합니다 (디버거 사용법을 배우기 전에 Hello World를 인쇄하는 방법을 배웠습니다).
예를 들어이 코드를 디버깅하기 위해 다음을 수행 할 수 있습니다.
private int myFunction(int a)
{
print("before foo: a=" + a);
a = foo(a);
print("before bar: a=" + a);
a = bar(a);
return a;
}
private int foo(int a)
{
//do something here
print ("foo step1: a=" + a);
//something gnarly here
print ("foo step2: a=" + a + " someOtherValue="+ someOtherValue + " array.length= " + someArray.length());
//etc
return aValue;
}
private int bar(int a)
{
// do something here
//return aValue;
}
이제 코드를 실행하고 콘솔 출력이 커져 문제가 발생한 위치를 추적 할 수 있습니다.
물론 대안은 중단 점을 설정하고 각 지점에서 코드를 단계별로 진행하는 것입니다.
콘솔로 인쇄 할 때의 주요 이점 중 하나는 개발자가 단계 등을 클릭하지 않고도 한 번에 값의 흐름을 볼 수 있다는 것입니다.
그러나 단점은 코드가 이러한 모든 인쇄 문으로 가득 차서 제거해야한다는 것입니다.
(디버거가 특정 값만 로그에 인쇄하도록 지시 할 수 있습니까? 그러면 실제로 코드를 수정하지 않고도 중단 점을 쉽게 추가하거나 제거 할 수 있습니다.)
나는 여전히 콘솔 인쇄를 기본 디버깅 방법으로 사용하고 있는데, 이것이 다른 곳과 비교하여 이것이 얼마나 일반적이고 효과적인지 궁금합니다.