Допустим, у нас есть такая функция:
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;
}
Теперь они запускают код, получают распечатку большой консоли, через которую они могут проследить, где что-то идет не так.
Альтернативой, конечно, является установка точек останова и пошаговое выполнение кода в каждой точке.
Одним из основных преимуществ печати на консоли является то, что разработчик может видеть поток значений за один раз, не нажимая на шаги и т. Д.
Но недостатком является то, что ваш код тогда полон всех этих операторов печати, которые затем необходимо удалить.
(Возможно ли, возможно, сказать отладчику печатать только определенные значения в журнале ?, точки останова могут быть легко добавлены или удалены без фактического изменения кода.)
Я все еще использую консольную печать в качестве основного метода отладки, мне интересно, насколько это распространено / эффективно по сравнению с чем-то еще.
Ответы:
Печатные операторы и отладчик не являются взаимоисключающими. Это просто разные инструменты, доступные вам для обнаружения / выявления ошибок. Есть те, кто будет утверждать, что они никогда не касаются отладчика, и есть те, у кого нет ни одного оператора записи / печати нигде в коде, который они пишут. Мой совет, что вы не хотите быть ни в одной из этих групп.
Вместо этого научитесь использовать ведение журнала и научитесь использовать отладчик. С опытом вы (почти не думая об этом) выберете правильный инструмент и сделаете работу точно и эффективно. Без опыта иногда вы выбираете одно над другим, и, возможно, вам понадобится немного больше времени, чтобы покопаться в переменных или просмотреть файлы журналов, но это все часть процесса обучения.
Итак, чтобы ответить на ваш конкретный вопрос. Да. Использование отпечатков для отслеживания выполнения является хорошей и широко используемой стратегией отладки. Однако...
Вместо использования операторов печати рассмотрите возможность использования каркаса ведения журнала. Каркасы журналов имеют концепцию уровней журналирования, поэтому вы можете добавить целую кучу сообщений журнала, но выбрать уровень для каждого из них. Когда ваше приложение работает в нормальных условиях, ваш уровень будет ОШИБКА или ПРЕДУПРЕЖДЕНИЕ, так что будут сообщаться только важные вещи. Однако, когда вы просматриваете код и вам необходимо понять поток выполнения, вы можете изменить регистратор на INFO или DEBUG, и теперь все те операторы «print», которые у вас уже есть в коде, сообщат дополнительную информацию.
Использование каркаса логирования ...
Обновление: я только заметил, что в конце вы спрашивали: «Возможно ли, возможно, сказать отладчику распечатать только определенные значения в журнале». В зависимости от того, какой отладчик вы используете. Многие современные отладчики позволяют вам определять действие, которое будет вызываться при достижении точки останова. В некоторых (я сделал это в VS и WinDbg), можно указать «напечатать это и возобновить». Visual Studio называет их «точками трассировки» вместо «точек останова»
источник
Регистрация / печать и отладчики - это дополнительные методы, которые имеют свои сильные и слабые стороны - лучше всего использовать оба. Но в целом, я бы сказал, что отладчики в большинстве случаев являются превосходным инструментом, и их следует использовать в первую очередь, так как ведение журнала / печать используются только для тех вещей, которые на самом деле лучше.
Преимущества отладчиков:
Преимущества регистрации / печати:
источник
Например, печать на стандартный вывод может быть хорошей стратегией для отладки вашего кода.
Я использую много операторов печати, чтобы увидеть, что происходит на разных уровнях моего кода, особенно если я не до конца понимаю ошибку
или, возможно, ошибка не содержит какой-либо подробной информации, которая могла бы указать мне, какая именно часть кода вызывает проблему.
Однако вам нужно привыкнуть к инструментам отладки, в зависимости от того, какой язык или платформу вы используете, их очень много.
Еще один метод - ведение журнала, я все время регистрирую ошибки при работе с приложениями Android, также с обработкой исключений, можно легко записать трассировку стека или сообщение об ошибке возникающего исключения.
источник