Дебаггинг что это
Перейти к содержимому

Дебаггинг что это

  • автор:

Что такое отладка?

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

Где возник термин «отладка»?

Термин «отладка» берёт своё начало от адмирала Грейс Хоппер, которая работала в Гарвардском университете в 1940-х годах. Когда один из ее коллег обнаружил моль, мешающую работе одного из компьютеров университета, она сказала, что они отлаживают систему. Компьютерные программисты впервые стали использовать термины «ошибки» и «отладка» в 1950-х годах, а к началу 1960-х годов термин «отладка» стал общепринятым в сообществе программистов.

Почему отладка важна?

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

Как работает процесс отладки?

Процесс отладки обычно требует выполнения указанных ниже шагов.

Определение ошибки

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

Анализ ошибки

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

Устранение и проверка

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

Сравнение отладки и тестирования

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

Какие ошибки кодирования требуют отладки?

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

Синтаксические ошибки

Синтаксическая ошибка возникает, когда в компьютерной программе неправильно указано значение. Это эквивалент опечатки или орфографической ошибки в текстовом редакторе. Если есть синтаксические ошибки, программа не будет компилироваться или запускаться. Как правило, программное обеспечение для редактирования кода выделяет эту ошибку.

Семантические ошибки

Семантические ошибки возникают из-за неправильного использования операторов программирования. Например, если вы переводите выражение x/(2 π) into Python, можете написать:

y = x / 2 * math.pi

Однако это утверждение неверно, поскольку умножение и деление имеют одинаковый приоритет в Python и вычисляются слева направо. Следовательно, это выражение вычисляется как (xπ)/2, а это приводит к ошибкам.

Логические ошибки

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

Ошибки времени выполнения

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

Какие есть общие стратегии отладки?

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

Пошаговая разработка программы

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

Возврат

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

Удаленная отладка

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

Ведение журналов

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

Отладка в облаке

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

Как AWS помогает с отладкой?

Есть несколько разных способов, при помощи которых AWS поддерживает кодирование и отладку.

Плагины для популярных IDE

Чтобы писать код, разработчики используют интегрированную среду разработки (IDE). AWS имеет несколько подключаемых модулей, совместимых с IDE, и поддерживает процесс отладки. Например, Набор инструментов AWS для Eclipse – это подключаемый модуль с открытым кодом для Eclipse Java IDE, позволяющий упростить процессы разработки, развертывания и отладки Java-приложений с помощью Amazon Web Services. Аналогично AWS также предоставляет поддержку отладки для других языков с помощью подключаемых модулей, которые интегрируются с другими популярными IDE, такими как:

  • PyCharm для Python.
  • IntelliJ IDEA для Java и Python.
  • Rider для .Net.
  • WebStorm для JavaScript.

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

AWS X‑Ray

AWS X-Ray – это инструмент отладки, который разработчики используют для анализа приложений в процессе разработки и производства. Он охватывает все: от простых трехуровневых приложений до сложных приложений микросервисов, состоящих из тысяч сервисов.

С X-Ray вы сможете:

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

Начните работу с AWS X-Ray, создав бесплатный аккаунт AWS уже сегодня.

Что такое дебаггинг? Значение термина дебаггинг

Дебаггинг (отладка) – это этап разработки программы, в ходе которого обнаруживают, локализуют и исправляют баги (ошибки). Чтобы определить, где находится ошибка, нужно:

  • Узнать текущее значение переменных
  • Выявить, по какому пути выполнялась программа

Есть два взаимодополняющих метода отладки

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

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

Полезные инструменты

  • Профилиоровщики. Позволяют определить, сколько времени выполняется конкретный участок кода.
  • API логгеры. Позволяют отследить взаимодействие программы и Windows API
  • Дизассемблеры. Позволяют просмотреть ассемблерный код
  • Сниферы. Помогают проследить сетевой трафик тестируемого ПО.
  • Логи системы.

Помогло? Делись!

Реклама:

Представляем
систему управления сайтами
NetCat

CMS NetCat — профессиональная коммерческая система управления Интернет-сайтами, один из лидеров на российском рынке веб-разработок.
Наша компания является сертифицированным партнером и рекомендуемым разработчиком сайтов на NetCat во Владивостоке.
В настоящее время большинство новых сайтов мы создаем на основе ее программной платформы.

Отладка программы

Отла́дка — этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится :

  • узнавать текущие значения переменных;
  • выяснять, по какому пути выполнялась программа.

Существуют две взаимодополняющие технологии отладки.

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

Место отладки в цикле разработки программы

Типичный цикл разработки, за время жизни программы многократно повторяющийся, выглядит примерно так:

  1. Программирование — внесение в программу новой функциональности, исправление ошибок в имеющейся.
  2. Тестирование (ручное или автоматизированное; программистом, тестером или пользователем; «дымовое», в режиме чёрного ящика или модульное…) — обнаружение факта ошибки.
  3. Воспроизведение ошибки — выяснение условий, при которых ошибка случается. Это может оказаться непростой задачей при программировании параллельных процессов и при некоторых необычных ошибках, известных как гейзенбаги.
  4. Отладка — обнаружение причины ошибки.

Инструменты

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

Инструменты отладки

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

Также полезными инструментами в руках программиста могут оказаться:

  • Профилировщики. Они позволят определить сколько времени выполняется тот или иной участок кода, а анализ покрытия позволит выявить неисполняемые участки кода.
  • API логгеры позволяют программисту отследить взаимодействие программы и Windows API при помощи записи сообщений Windows в лог.
  • Дизассемблеры позволят программисту посмотреть ассемблерный код исполняемого файла
  • Снифферы помогут программисту проследить сетевой трафик генерируемой программой
  • Снифферы аппаратных интерфейсов позволят увидеть данные которыми обменивается система и устройство.
  • Логи системы.

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

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

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

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

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

Инструменты, снижающие потребность в отладке

Другое направление — сделать, чтобы отладка нужна была как можно реже. Для этого применяются:

  • Контрактное программирование — чтобы программист подтверждал другим путём, что ему на выходе нужно именно такое поведение программы. В языках, в которых контрактного программирования нет, используется самопроверка программы в ключевых точках.
  • Модульное тестирование — проверка поведения программы по частям.
  • Статический анализ кода — проверка кода на стандартные ошибки «по недосмотру».
  • Высокая культура программирования, в частности, паттерны проектирования, соглашения об именовании и прозрачное поведение отдельных блоков кода — чтобы объявить себе и другим, каким образом должна вести себя та или иная функция.
  • Широкое использование проверенных внешних библиотек.

Безопасность программного кода и отладка

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

  • Выявление недокументированного поведения системы
  • Устранение небезопасного кода

Выделяют такие методы:

  • статический анализ кода. На этой фазе программа сканер ищет последовательности в исходном тексте, соответствующие небезопасным вызовам функций и т. д. Фактически идет сканирование исходного текста программы на основе специальной базы правил, которая содержит описание небезопасных образцов кода.
  • фаззинг. Это процесс подачи на вход программы случайных или некорректных данных и анализ реакции программы.
  • Reverse engineering (Обратная инженерия). Этот случай возникает, когда независимые исследователи ищут уязвимости и недокументированные возможности программы.

Вы поможете проекту, исправив и дополнив его.

Литература

  • Стив Магьюир, «Создание надёжного кода» (Steve Maguire. Writing Solid Code. Microsoft Press, 1993)
  • Стив Мак-Коннел, «Совершенный код» (Steve McConnel. Code Complete. Microsoft Press, 1993)

См. также

  • Отладчик
  • Отладчик ядра
  • Стек вызовов
  • Утечка памяти
  • Точка останова
  • Тестирование программного обеспечения
  • Программирование
  • Отладочные символы

Ссылки

  • Отладка AMD64 на уровне машинного кода с помощью отладчика dbx (рус.)

Отладка — JS: Express

Настало время серьёзно поговорить про отладку. На протяжении многих курсов вы постоянно занимались отладкой, иногда часами, а иногда и днями, не могли понять, почему всё работает не так, как должно работать. Это норма! (c) В повседневной практике такое случается не редко.

Обычно всё ещё хуже. Бага произошла на продакшене, и у вас уже нет возможности воспроизвести ситуацию. Чем сложнее система, тем меньше шансов что это возможно. Каким образом отлаживать код в такой ситуации? Здесь мы приходим к главной идее отладки. Правильная отладка — это хорошо настроенное логирование.

Есть общие практики, принятые во всех экосистемах, о которых мы сейчас поговорим. В этой истории немного особняком стоит именно js . Основной способ логирования, принятый в js , идет своим путём, который, на мой взгляд, достаточно неплох.

Классическое логирование выглядит так. Подключается специальная библиотека со следующим интерфейсом:

logger.debug("I'm a debug message!"); logger.info("OMG! Check this window out!"); logger.error("HOLY SHI. no carrier."); 

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

Уровни логирования имеют следующую семантику:

  • TRACE — дебаговые сообщения для определения flow
  • DEBUG — дебаговые сообщения для определения conditions
  • INFO — этапы нормального flow
  • WARN — некритичные ошибки (но результат должен быть верным)
  • ERR — ошибки, которые могут привести к неверному результату
  • FATAL — «ща грохнусь!»

Чем ближе к началу списка, тем более подробный (говорят «verbose») лог. Важно, что в коде присутствуют все уровни, и вызовы проставляются самим программистом на основе его понимания работы программы. А вот дальше, уже во время эксплуатации программы, на уровне конфигурации, задаётся, какой уровень логирования необходимо поддерживать для данного запуска. Предположим, что стоит уровень info , что типично для production систем. Это значит, что в лог будут выводиться только те строчки, которые предназначены для уровней с info по fatal . Во время разработки уровень обычно debug , на этом уровне выводится много отладочной информации, позволяющей понять как идут и преобразуются данные. А так же по каким частям кода идет flow.

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

Debug

А теперь забудьте всё, что я вам говорил до этого :D. Шутка. Но суровая правда в том, что в js доминирует немного другой подход, что не отрицает возможности комбинирования.

Подход js по сути завязан на конкретную библиотеку, которая предложила нестандартный способ работы.

import debug from 'debug'; const log = debug('http'); const name = 'App'; log('booting %s', name); // http booting App 

Первое, что бросается в глаза, это отсутствие уровней логирования. Второе: перед использованием логера импортируется специальная функция, которая вызывается так debug(‘http’) . Передаваемая строчка представляет из себя namespace . Имя, которое, подобно уровню логирования, отделяет логи друг от друга. В отличие от уровней логирования, неймспейсы не имеют никаких ограничений, их может быть столько, сколько нужно, и называть их можно как угодно. Неймспейсы, по сути, отвечают за некоторую подсистему, по которой мы хотим логировать. На практике это оказывается крайне удобным подходом. Обычно мы примерно понимаем на каком уровне и в какой подсистеме произошла ошибка, и хочется выводить лог (подробный) только по этой подсистеме. В случае использования уровней логирования это сделать невозможно, и приходится выискивать нужные строчки в массе других. С использованием неймспейсов это естественный способ работы.

import debug from 'debug'; const httpRequestLog = debug('http:request'); const rpcLog = debug('rpc'); httpRequestLog('request'); rpcLog('action'); 

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

А теперь самое главное. Так сложилось, что 99% самых популярных библиотек на js уже поставляются со встроенным логированием через debug . По сути, нам не очень-то и оставили выбор. На картинке выше как раз видно кусок лога Express.

Последний вопрос касается того, как управлять этим выводом. По умолчанию debug ничего не печатает. Чтобы это изменить, нужно передать переменную окружения DEBUG следующим образом:

DEBUG=* bin/server.js DEBUG=http:* bin/server.js DEBUG=*,-not-this bin/server.js 

Пример демонстрирует три разных варианта использования:

  • Вывести все логи (это коснется не только вашего приложения, будут выведены логи всех

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Добавить комментарий

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