Есть ли способ избежать отладчика? - PullRequest
2 голосов
/ 15 апреля 2010

Мне не нравится отладка в отладчике, потому что я думаю, что она часто находится ниже уровня абстракции языка программирования и часто не воспроизводима. Я предпочитаю использовать модульные тесты, когда это возможно, и я думаю, что это хороший способ, но не всегда их легко реализовать. Знаете ли вы о каких-либо других альтернативных подходах, чтобы избежать использования отладчика?

Ответы [ 8 ]

7 голосов
/ 15 апреля 2010

Отладчик - это инструмент, который говорит, что я хочу избежать отладчика, как плотник, который говорит, что я хочу избежать молотка. Вам лучше задать вопрос Когда мне следует избегать использования отладчика?

Времена, когда вам следует избегать использования отладчика,

  • Если вы не знаете, что делает код, сначала поймите, а затем попробуйте отладку, иначе вы теряете время
  • Проблема связана с синхронизацией (условия гонки, проблемы с IPC или потоками), если это условие синхронизации и вы начинаете пошаговое выполнение, то вы можете не воспроизвести свою проблему.

Я уверен, что бывают случаи, когда использование отладчика - плохая идея, но моя точка зрения в том, что ваш вопрос неверен. Не спрашивайте, как мне не использовать отладчик, а спрашивайте, когда я должен / не должен использовать отладчик.

мои 2цента

5 голосов
/ 15 апреля 2010

Подумайте! :) - Серьезно, хотя - до того как отладчики стали общедоступными, большинство людей решали бы проблемы с кодом, записывая большое количество информации о состоянии на свое устройство вывода. Это все еще работает.

4 голосов
/ 15 апреля 2010

Проектирование по контракту, модульные тесты и подобные вещи помогают вам гарантировать, что блок кода, чаще всего функция, работает должным образом. Это хорошо для этого, но не заменяет отладку.

Отладка означает выяснить , почему блок кода ведет себя не так, как должен. Модульный тест может только сказать вам, что блок не работает должным образом, он не может сказать вам почему . Чтобы выяснить, почему, вы должны построчно пройти по коду, отслеживая, где состояние отличается от того, что вы ожидаете, или где логика неожиданно разветвляется. Чтобы отследить эти вещи, вы должны проверить состояние в любой момент времени. Вы можете сделать это с помощью print операторов, используя их для получения переменных состояний или для вывода логических ветвлений. Отладчик - это инструмент, который помогает вам выполнять оба действия без изменения кода.

Вам придется использовать любой из них. Даже модульный тест - это, по сути, оператор print, который автоматически проверяется на корректность, просто на другом уровне детализации.

Кажется, вы хотите исправить сам код, не глядя на него. Вы можете ставить тесты и контракты вокруг вашего кода, сколько хотите, если эти вещи сообщают вам, что в вашем коде есть ошибка , в конечном итоге вам придется ее рассмотреть. Если вы хотите проверить код, не изменяя его, вставив операторы print, единственным оставшимся инструментом является отладчик. Если нет большого прорыва, это состояние дел.

4 голосов
/ 15 апреля 2010
  1. Тестирование! = Отладка! = Регистрация
  2. Избегать использования отладчика нереально. В конце концов вам придется освоить определенные методы отладки, чтобы исправить сложные ошибки.
3 голосов
/ 15 апреля 2010

Любое нетривиальное приложение должно иметь встроенную функцию регистрации / трассировки. Вы захотите иметь возможность включать / выключать различные виды вывода.

Особенно полезно регистрировать все входные данные. Проблемы намного проще воспроизвести, если вы можете «воспроизвести» ввод.

1 голос
/ 15 апреля 2010

Печать строк tm Я думаю, что это наиболее часто используемый способ отладки.

Вы знаете:

  log("Starting transaction for client id %s", id )

Всегда проверяйте, используете ли вы хорошую структуру ведения журналов, иначе ваши журналы станут бесполезными.

1 голос
/ 15 апреля 2010

Одной из стратегий является разработка режима «отладки», в котором приложение предоставляет несколько полезных сведений, таких как используемые ресурсы, переменные http, журналы, операторы sql и т. Д. *

Например, у меня есть веб-приложение, которое управляет состоянием веб-страницы через скрытые входные данные и взаимодействует с базой данных с помощью сообщений XML ...

когда я добавляю «debug = 1» к URL-адресу, все скрытые входные данные отображаются в сворачиваемом блоке, а также выполненные xml-in и xml-out ...

более того, в режиме отладки я могу дважды щелкнуть мышью в определенном месте страницы, чтобы просмотреть информацию о конфигурации базы данных, а также есть ярлык для «олицетворения» пользователей, чтобы проверить разрешения ...

одним из последних дополнений является складное окно, которое показывает мне время, необходимое для построения всей страницы, и время, необходимое для доступа к базе данных

на стороне базы данных, мы обрабатываем этот xml и генерируем несколько SQL-операторов. Если вместо выполнения запроса я добавляю тег xml 1 </ show_sql>, я получаю инструкцию sql ... чтобы я мог "отладить" хранимую процедуру из консоли sql ...

Вы можете разработать все это за пару дней, и я могу заверить вас, что это действительно окупается ...

Чтобы получить представление о том, о чем я говорю, вы можете взглянуть на передний конец для разработчика, проверенный с помощью фреймворка Symfony

http://www.symfony -project.org / книга / 1_0 / 16-Application-Management-Tools

это позволит вам проверить несколько вещей, таких как записанная информация, содержимое запросов и ответов, выполненные действия и т. Д. *

короче, подготовьте ваше приложение к проверке ...

1 голос
/ 15 апреля 2010

Лично я сам редко использую отладчик. Я обычно нахожу, что я провожу слишком много времени, шагая в одиночку и вообще возиться с механикой, прежде чем доберусь до той части, которая имеет значение.

Мой любимый метод отладки - просто добавлять операторы печати в стратегических местах. Например, если вычисление дает неправильный ответ, я мог бы добавить операторы печати, чтобы вывести значения, которые входят в вычисление.

На Java я обычно пишу что-то вроде

System.out.println ("В функции foo: bar =" + bar + ", plugh =" + plugh);

Если проблема заключается в том, по какому пути программа прошла через логику, я добавлю операторы, которые выводят «около ввода блока калькуляции продаж» или «завершение записи в базу данных» или что-то подобное.

Я прибегаю к отладчику, только когда понятия не имею, в чем заключается проблема, и я не могу придумать ничего лучшего, как пройти каждый шаг, чтобы увидеть, где он идет не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...