Опубликован: 24.11.2024 | Доступ: свободный | Студентов: 1 / 0 | Длительность: 02:06:00
Лекция 6:

Методы отладки

< Лекция 5 || Лекция 6 || Лекция 7 >

Отладка - неотъемлемая часть жизненного цикла разработки программного обеспечения. Даже при самых надежных методах программирования возникают ошибки, и их отладка - не самое приятное занятие. В любом широко используемом программном обеспечении над кодом работают многие разработчики, и отладка занимает значительную часть их времени. Именно поэтому такие методологии разработки программного обеспечения, как TDD (Test Driven Development, разработка через тестирование), защитное программирование и контрактное программирование, приняты многими организациями. Некоторые языки программирования даже обеспечивают поддержку некоторых методологий; например, D реализует функции контрактного программирования.

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

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

После знакомства с этой лекцией вы будете уметь:

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

Презентация к лекции

Типы ошибок в программах

В целом, сбои в работе приложений можно разделить на три категории:

  1. Ошибки программирования (синтаксические ошибки, семантические ошибки, ошибки времени выполнения).
  2. Сбой системы (ошибки памяти, повреждение файла, сбой сети и т.д.).
  3. Недействительные данные (некорректное имя файла, некорректные данные).

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

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

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

  1. Отладка на основе инструментирования
  2. Использование отладчика
  3. Удалённая отладка с помощью gdb
  4. Отладка на основе JTAG
Отладка на основе инструментирования

Методы отладки на основе инструментирования - это методы вставки кода в программы вручную или программно. Это помогает получить представление о коде во время выполнения программы. Есть три наиболее широко используемых подхода:

  1. Отладочная печать
  2. Отладка на основе assertion'ов
  3. Использование санитайзеров

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

Отладочная печать

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

Отладка на основе assertion

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

Санитайзеры

И clang, и GCC предоставляют инструментарий (санитайзеры), который может обнаружить несколько известных классов ошибок, таких как переполнение буфера, повреждение памяти и многих других. Существуют санитайзеры адресов, памяти, неопределенного поведения, потоков и прочие. Это обеспечивает автоматизированный способ обнаружения ошибок. Санитайзеры также требуют поддержки времени выполнения для поиска ошибок, а она доступна не на всех платформах. Например, RISC-V в настоящее время поддерживает только санитайзер адресов и санитайзер потоков. Этот документ является источником достоверной информации для всей документации по санитайзерам.

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

Нативная отладка с помощью отладчика

Когда есть отладчик, становится очень удобно проверять программы, получать трассировку стека, значения объектов, состояние различных потоков и т.д. Обучение эффективному использованию отладчика, такого как gdb, значительно упрощает разработку программного обеспечения. Часто используемыми командами gdb являются:

  • gdb --args <binary> <args> для запуска программы со списком аргументов.
  • b FileName:linenumдля установки точек останова
  • bt для получения трассировки стека1Примечание переводчика: исторически в gdb используется термин backtrace для обозначения трассировки стека (stack trace), поэтому команда и называется bt.
  • thread apply all bt для получения трассировки стека для всех потоков
  • p variableName для печати значения переменной/объекта
  • up для перехода вверх по кадру стека
  • down для перехода вниз по кадру стека
  • l для перечисления исходных строк кода вокруг текущего фрейма стека
  • disassemble для отображения ассемблерного кода текущей функции
  • n для выполнения следующей инструкции источника
  • si для выполнения следующей машинной инструкции
  • q для выхода из отладчика
  • r для запуска программы

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

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

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

В случае заинтересованности вы можете начать работу со со статьи блога "Удаленная отладка с GDB". Страница руководства gdbserver(1) - Linux также предлагает отличную документацию. В официальном репозитории RISC-V binutils есть исходный код gdbserver.

Отладка на основе JTAG

На ранней стадии ввода в эксплуатацию аппаратного обеспечения отсутствуют программные возможности. Для отладки " голых" приложений или доступа к различным аппаратным блокам в качестве транспортного механизма используется JTAG (названный в честь Joint Test Action Group). Большинство современных аппаратных средств предоставляют возможность прямой трассировки инструкций и данных с помощью стандартного протокола JTAG, хотя у каждого производителя аппаратных средств может быть разный уровень поддержки. Он часто используется для отладки аппаратных неполадок. RISC-V определяет стандартный интерфейс для внешней отладки, который включает в себя доступ к аппаратным потокам (hart) с самой первой инструкции, доступ к памяти, пошаговые инструкции и т. д.

Справочные материалы

< Лекция 5 || Лекция 6 || Лекция 7 >