Что такое отладчик и как он может помочь мне в диагностике проблем?

Aug 19 2014

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

Этот вопрос охватывает три класса более конкретных вопросов:

  • Когда я запускаю свою программу, она не дает результата, который я ожидал от введенных мной данных.
  • Когда я запускаю свою программу, она вылетает и дает мне трассировку стека. Я изучил трассировку стека , но до сих пор не знаю причины проблемы, потому что трассировка стека не дает мне достаточно информации.
  • Когда я запускаю свою программу, она дает сбой из-за ошибки сегментации (SEGV).

Ответы

68 Raedwald Aug 19 2014 at 20:49

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

Использование отладчика - ожидаемый базовый навык

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

Как отладчик может вам помочь

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

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

Общие примечания по использованию отладчика

Специфика использования отладчика зависит от отладчика и, в меньшей степени, от языка программирования, который вы используете.

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

  • На практике часто проще с самого начала запустить вашу программу под управлением отладчика.

  • Вы указываете, где ваша программа должна прекратить выполнение, указав файл исходного кода и номер строки той строки, на которой выполнение должно остановиться, или указав имя метода / функции, на которой программа должна остановиться (если вы хотите остановиться как как только исполнение входит в метод). Технические средства, которые отладчик использует для остановки вашей программы, называются точкой останова, а этот процесс называется установкой точки останова .

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

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

39 SlugFiller Apr 05 2015 at 19:15

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

  • Часть вашей программы, которая терпит неудачу, действительно велика (возможно, плохая модульность?), И вы не совсем уверены, с чего начать пошаговое выполнение кода. Прохождение всего этого может занять слишком много времени.
  • Ваша программа использует множество обратных вызовов и других методов нелинейного управления потоком, что сбивает с толку отладчик, когда вы выполняете его.
  • Ваша программа многопоточная. Или, что еще хуже, ваша проблема вызвана состоянием гонки.
  • Код, в котором есть ошибка, запускается много раз, прежде чем выйдет из строя. Это может быть особенно проблематичным в основных циклах или, что еще хуже, в физических движках, где проблема может быть числовой. Даже установка точки останова в этом случае просто заставит вас ударить по ней много раз, а ошибка не появится.
  • Ваша программа должна работать в режиме реального времени. Это большая проблема для программ, которые подключаются к сети. Если вы установите точку останова в своем сетевом коде, другой конец не будет ждать, пока вы перейдете, он просто истечет. Программы, которые полагаются на системные часы, например, игры с пропуском кадров, тоже не намного лучше.
  • Ваша программа выполняет некоторую форму деструктивных действий, таких как запись в файлы или отправка электронной почты, и вы хотели бы ограничить количество раз, которое вам нужно запускать через нее.
  • Вы можете сказать, что ваша ошибка вызвана неверными значениями, поступающими в функцию X, но вы не знаете, откуда эти значения. Необходимость запускать программу снова и снова, устанавливая точки останова все дальше и дальше назад, может быть огромной проблемой. Особенно, если функция X вызывается из многих мест по всей программе.

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

Итак, каковы альтернативы?

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

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

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

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

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