Подтвердить что ты не робот

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

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

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

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

Пример уценки: [What is a debugger and how can it help me diagnose problems?](https://stackoverflow.com/q/25385173)

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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