Отладка - неотъемлемая часть жизненного цикла разработки программного обеспечения. Даже при самых надежных методах программирования возникают ошибки, и их отладка - не самое приятное занятие. В любом широко используемом программном обеспечении над кодом работают многие разработчики, и отладка занимает значительную часть их времени. Именно поэтому такие методологии разработки программного обеспечения, как TDD (Test Driven Development, разработка через тестирование), защитное программирование и контрактное программирование, приняты многими организациями. Некоторые языки программирования даже обеспечивают поддержку некоторых методологий; например, D реализует функции контрактного программирования.
Отладка нативных приложений затруднена из-за семантики языка программирования, разнообразия зависимого программного обеспечения, зависимости от аппаратных характеристик, таких как модель потоков, модель памяти и т. д. Поэтому очень важно знать различные технологии отладки, доступные нам. В этой лекции мы представим различные инструменты отладки и дадим краткое введение в каждый из них.
Сначала мы познакомимся с различными типами ошибок, которые встречаются в программном обеспечении, а затем изучим различные инструменты, облегчающие процесс отладки.
После знакомства с этой лекцией вы будете уметь:
В целом, сбои в работе приложений можно разделить на три категории:
Некоторые ошибки трудно отнести к определенному классу, поскольку классификация может зависеть от точки отсчета. Например, повреждение данных в одном приложении может привести к тому, что зависимое приложение выдаст ошибку времени выполнения. В зависимости от типа сбоя применяются различные инструменты и методологии. В этой лекции мы сосредоточимся на ошибках программирования, а в следующих разделах представим инструменты и методики, относящиеся к ним.
При работе с тулчейном, настройке системы или разработке системного программного обеспечения часто используемые методы отладки можно разделить на четыре категории:
gdbJTAGМетоды отладки на основе инструментирования - это методы вставки кода в программы вручную или программно. Это помогает получить представление о коде во время выполнения программы. Есть три наиболее широко используемых подхода:
assertion'овЕсли отладочная печать и отладка на основе assertion'ов - одни из самых ранних методов отладки, то санитайзеры появились относительно недавно. Ниже мы кратко опишем каждую технику.
Простейшая техника отладки заключается в добавлении в программу набора операторов печати и наблюдении за выводимыми значениями. Вставка операторов печати в тщательно определенные точки программы может помочь отладить программу. Это один из самых ранних методов отладки, и он весьма полезен даже сегодня. Однако в ряде случаев этот подход не срабатывает, поскольку он плохо масштабируется. Если программист не обладает хорошим знанием кода, то при таком подходе трудно быстро найти проблемы.
Чтобы установить пред- и постусловия в различных точках программы, обычно вставляются assertion'ы. Ошибка в assertion упрощает отладку. Это также помогает обнаруживать ошибки на ранней стадии разработки. Обычно assertion отключены в производственном коде, поэтому одним из первых шагов по отладке является включение assertion и запуск неудачного тестового сценария.
И clang, и GCC предоставляют инструментарий (санитайзеры), который может обнаружить несколько известных классов ошибок, таких как переполнение буфера, повреждение памяти и многих других. Существуют санитайзеры адресов, памяти, неопределенного поведения, потоков и прочие. Это обеспечивает автоматизированный способ обнаружения ошибок. Санитайзеры также требуют поддержки времени выполнения для поиска ошибок, а она доступна не на всех платформах. Например, RISC-V в настоящее время поддерживает только санитайзер адресов и санитайзер потоков. Этот документ является источником достоверной информации для всей документации по санитайзерам.
На некоторых платформах Valgrind также может обнаружить ошибки, которые выявляются некоторыми санитайзерами, например, повреждение памяти или её утечки. К сожалению, в настоящее время Valgrind недоступен для платформ RISC-V.
Когда есть отладчик, становится очень удобно проверять программы, получать трассировку стека, значения объектов, состояние различных потоков и т.д. Обучение эффективному использованию отладчика, такого как gdb, значительно упрощает разработку программного обеспечения. Часто используемыми командами gdb являются:
gdb --args <binary> <args> для запуска программы со списком аргументов.b FileName:linenumдля установки точек остановаbt для получения 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 (названный в честь Joint Test Action Group). Большинство современных аппаратных средств предоставляют возможность прямой трассировки инструкций и данных с помощью стандартного протокола JTAG, хотя у каждого производителя аппаратных средств может быть разный уровень поддержки. Он часто используется для отладки аппаратных неполадок. RISC-V определяет стандартный интерфейс для внешней отладки, который включает в себя доступ к аппаратным потокам (hart) с самой первой инструкции, доступ к памяти, пошаговые инструкции и т. д.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.