Скажімо, у нас є така функція:
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;
}
Тепер з будь-якої причини наш код не працює. Можливо, це кидання помилки, можливо повернення неправильного значення, можливо, воно застрягло в нескінченному циклі.
Перше, що будь-який програміст першого року - це друк для консолі / std, (навчившись друкувати 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;
}
Тепер вони запускають код, отримують великий консольний друк, за допомогою якого вони можуть простежити, де все йде не так.
Альтернативою, звичайно, є встановлення точок перерви та проходження коду в кожній точці.
Однією з головних переваг друку на консолі є те, що розробник може бачити потік значень за один раз, не потребуючи натискання кроків тощо.
Але недоліком є те, що ваш код потім пронизується усіма цими твердженнями про друк, які потім потрібно видалити.
(Чи можливо, можливо, сказати налагоджувачу надрукувати в журнал лише певні значення? Точки точки розриву можна легко додавати або видаляти без фактичного зміни коду.)
Я все ще використовую консольний друк як основний метод налагодження, мені цікаво, наскільки це поширене / ефективне порівняно з чимось іншим там.