Отладка - Debugging

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

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

Этимология

Запись компьютерного журнала от Mark II, с наклеенной на страницу ночной бабочкой.

Термины «ошибка» и «отладка» обычно приписываются адмиралу Грейс Хоппер в 1940-х годах. Когда она работала над компьютером Mark II в Гарвардском университете, ее сотрудники обнаружили мотылек, застрявший в реле и тем самым препятствующий работе, после чего она заметила, что они «отлаживают» систему. Однако термин «ошибка» в смысле «техническая ошибка» восходит как минимум к 1878 году и Томасу Эдисону ( полное обсуждение см. В ошибке программного обеспечения ). Точно так же термин «отладка», кажется, использовался как термин в аэронавтике до того, как войти в мир компьютеров. В самом деле, в интервью Грейс Хоппер отметила, что она не придумывала этот термин. Ночная бабочка соответствовала уже существующей терминологии, поэтому ее спасли. В письме Роберта Оппенгеймера (директора проекта создания атомной бомбы Второй мировой войны «Манхэттен» в Лос-Аламосе, штат Нью-Мексико) этот термин использовался в письме доктору Эрнесту Лоуренсу из Калифорнийского университета в Беркли от 27 октября 1944 г. относительно набора дополнительных технический персонал.

В Оксфордском словаре английского языка для слова «отладка» цитируется термин «отладка», использованный в отношении испытаний авиационных двигателей в статье 1945 года в Журнале Королевского авиационного общества. В статье в «Военно-воздушных силах» (июнь 1945 г., стр. 50) также говорится об отладке, на этот раз авиационных фотоаппаратов. Ошибка Хоппера была обнаружена 9 сентября 1947 года. Компьютерные программисты не использовали этот термин до начала 1950-х годов. Основополагающая статья Гилла в 1951 году - самое раннее подробное обсуждение ошибок программирования, но в ней не используются термины «ошибка» или «отладка». В цифровой библиотеке ACM термин «отладка» впервые используется в трех статьях, опубликованных на Национальных собраниях ACM 1952 года. Двое из трех используют этот термин в кавычках. К 1963 году «отладка» стала достаточно распространенным термином, который можно было упомянуть мимоходом без объяснения на странице 1 руководства CTSS .

В статье Пегги А. Кидвелл « Преследование неуловимой компьютерной ошибки » более подробно обсуждается этимология понятий «ошибка» и «отладка».

Сфера

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

Инструменты

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

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

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

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

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

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

Процесс отладки

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

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

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

Методы

  • Интерактивная отладка
  • Отладка печати (или трассировка) - это наблюдение (в реальном времени или в записи) операторов трассировки или операторов печати, которые указывают ход выполнения процесса. Иногда это называютprintf из-за использованияфункции printfв C. Этот вид отладки был включен командой TRON в исходных версиях ориентированного на новичковязыкапрограммированияBASIC. TRON расшифровывался как «Trace On». TRON заставлял печатать номера строк каждой BASIC-командной строки во время работы программы.
  • Удаленная отладка - это процесс отладки программы, работающей в системе, отличной от отладчика. Чтобы начать удаленную отладку, отладчик подключается к удаленной системе по каналу связи, например по локальной сети. Затем отладчик может контролировать выполнение программы в удаленной системе и получать информацию о ее состоянии.
  • Посмертная отладка - это отладка программы после того, как она уже вышла из строя . Связанные методы часто включают в себя различные методы отслеживания, такие как изучение файлов журнала, вывод стека вызовов при сбое и анализ дампа памяти (или дампа ядра ) сбойного процесса. Дамп процесса может быть получен системой автоматически (например, когда процесс завершился из-за необработанного исключения), или введенной программистом инструкцией, или вручную интерактивным пользователем.
  • Алгоритм «волчьего забора»: Эдвард Гаусс описал этот простой, но очень полезный и теперь известный алгоритм в статье 1982 года для ACM следующим образом: «На Аляске есть один волк; как вы его нашли? Сначала постройте забор посередине. штата, подождите, пока волк завоет, определите, с какой стороны забора он находится. Повторите процесс только с этой стороны, пока не дойдете до точки, где можно увидеть волка ». Это реализовано, например, в системе управления версиями Git в виде команды git bisect , которая использует вышеупомянутый алгоритм для определения того, какая фиксация привела к конкретной ошибке.
  • Отладка с записью и воспроизведением - это метод создания записи выполнения программы (например, с использованием бесплатногоинструмента отладки RR Mozilla; включение обратимой отладки / выполнения), которую можно воспроизвести и отладить в интерактивном режиме. Полезно для удаленной отладки и устранения прерывистых, недетерминированных и других трудно воспроизводимых дефектов.
  • Дельта-отладка  - метод автоматизации упрощения тест-кейсов.
  • Saff Squeeze  - метод выявления сбоя в тесте с использованием постепенного встраивания частей неуспешного теста.
  • Отслеживание причинно-следственной связи: существуют методы отслеживания причинно-следственных цепочек в вычислениях. Эти методы могут быть адаптированы для конкретных ошибок, таких как разыменование нулевого указателя.

Отладка для встраиваемых систем

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

Несмотря на упомянутую выше проблему неоднородности, некоторые отладчики были разработаны как в коммерческих целях, так и в качестве исследовательских прототипов. Примеры коммерческих решений поступают от Green Hills Software , Lauterbach GmbH и MPLAB-ICD от Microchip (для внутрисхемного отладчика). Двумя примерами инструментов исследовательских прототипов являются Aveksha и Flocklab. Все они используют функциональность, доступную на недорогих встроенных процессорах, модуль отладки на кристалле (OCDM), сигналы которого отображаются через стандартный интерфейс JTAG . Они оцениваются на основе того, сколько изменений требуется в приложении, и скорости событий, за которыми они могут успевать.

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

Анти-отладка

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

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

Ранний пример анти-отладки существовал в ранних версиях Microsoft Word, который при обнаружении отладчика выдавал сообщение, в котором говорилось: «Дерево зла приносит горькие плоды. диск, чтобы издавать тревожные звуки с целью отпугнуть пользователя от повторной попытки.

Смотрите также

использованная литература

дальнейшее чтение

внешние ссылки