Традиционный отладчик позволяет вам проверять состояние системы после ее остановки, то есть после обнаружения ошибки, но при этом он не обнаруживает само события, приводящие к ошибке. Чтобы узнать, почему произошел сбой, необходимо произвести пошаговое выполнение программы (трассировку).
Трассировка означает, что поведение программного обеспечения записывается во время выполнения, что позволяет провести последующий анализ его работы. Сгенерированная аппаратными средствами последовательность команд (в процессоре) дает вам все подробности относительно потока управления и не влияет на процессы отслеживаемой системы. Однако для этого требуется специальный блок отладки и аппаратное обеспечение с поддержкой трассировки в целом. Трассировка с помощью программного обеспечения работает на любой аппаратной платформе, а также может быть активной непрерывно во время длительных сеансов тестирования. Во многих случаях программная трассировка может быть развернута в производственных системах.
Трассировка программного обеспечения будет использовать циклы ЦП и ОЗУ отслеживаемой системы, хотя это часто является разумным компромиссом, учитывая ценность полученных последовательностей данных. Если у вас нет строгого требования к быстродействию системы, вплоть до уровня микросекунды, трассировка программного обеспечения проста, понятна и является вполне жизнеспособным решением. Давайте рассмотрим некоторые мифы, окружающие этот подход.
Для трассировки требуется «передовой» отладчик
Это не обязательно так. Существуют различные виды трассировки. Такие инструменты, как Linux (LTTng) и Tracealyzer от Percepio, полагаются на программную трассировку для систем, использующих RTOS, позволяя захватывать все релевантные события в ядре RTOS и любые дополнительные события, которые вы добавляете в код приложения. Такая трассировка не требует специального оборудования и может использоваться практически для любой системы. Данные генерируются программным обеспечением и сохраняются в локальном буфере ОЗУ или передаются на ПК с использованием любого коммуникационного порта с достаточной производительностью.
Настройка трассировки достаточно сложный процесс
Трассировка на основе программного обеспечения, как правило, довольно проста в настройке — обычно это делается за чашечкой кофе. Вам нужно включить библиотеку для записи в свою сборку, настроить ее в соответствии с оборудованием и включить параметр трассировки в операционной системе реального времени (RTOS).
Трассировка — последнее средство при отладке
Некоторые думают о трассировке как о последней надежде: когда вы не можете найти ошибку другими способами, вы пытаетесь отслеживать события. Однако хороший инструмент отслеживания лучше рассматривать как подстраховку. Несомненно, добавление поддержки трассировки в вашу систему потребляет некоторые из ваших драгоценных тактовых циклов и байтов, но эта небольшая премия покупает вам инструмент, который поможет вам понять, отладить и оптимизировать вашу программу. Вы можете обнаружить слабые стороны задолго до того, как основные ошибки начнут проявляться при работе с клиентами.
Трассировка событий является ценным дополнением к традиционным средствам отладки, помогая вам «увеличить масштабы обнаружения» сложных проблем, чтобы вы знали, где сосредоточить ваши дальнейшие усилия по отладке.
Журналы логов огромны и трудны в понимании
Журналы логов, безусловно, может быть трудно интерпретировать, особенно без правильной визуализации. Также фактом является то, что большая часть данных состоит из повторяющихся частей, многие из которых не имеют отношения к проблеме. Найти иглу в стоге сена задача довольно трудная.
Более продвинутые инструменты трассировки имеют десятки графических представлений, которые позволят вам просматривать систему с разных точек и на разных уровнях абстракции, позволяя вам «откопать» аномалии и понять причину. Это значительно облегчает обзор ваших логов и получение полезной информации из них.
С трассировкой ядра RTOS способны справится только хакеры
Абсолютная неправда. Разработчики, ориентированные на разработку собственных приложений, могут много выиграть от трассировки на уровне операционной системы, поскольку вы можете регистрировать собственные события и данные (например, входы, выходы, переходы состояний), для облегчения анализа алгоритмов и состояний машин в приложении. Этот вид трассировки очень быстрый и поэтому может также использоваться в критическом по времени коде, в отличие от традиционных вызовов «printf».
Tracealyzer может визуализировать взаимодействие во время выполнения между задачами приложения в виде графиков зависимостей (кто с кем обменивается данными) и отфильтрованные временные графики, которые дают лучшую картину архитектуры приложения, дополняя анализ исходного кода. Кроме того, Tracealyzer может профилировать производительность вашего приложения в отношении времени процессора и использования памяти для каждой задачи и обработчика прерываний, а не только статических средних значений и визуальных графиков с течением времени.
Инструменты трассировки очень дорогие
С одной стороны, это правда. Хорошие инструменты стоят хороших денег, особенно по сравнению с инструментами разработчика, которые вы можете скачать бесплатно. С другой стороны, возможность поиска ошибок на ранних этапах в процессе разработки может сэкономить гораздо больше. Ошибка, которая окажется в выпущенном приложении или отсрочка его публикации, может стоить гораздо больших денег, чем покупка лицензионной версии ПО.
Трассировка предназначена только для жестких систем безопасности в режиме реального времени
Не правда. Менее критические встроенные системы часто больше, имеют больше кода и более сложное поведение во время работы по сравнению с критическими безопасными системами реального времени. Несмотря на то, что последствия сбоев менее суровы, их поведение может быть намного сложнее предсказать только из исходного кода, из-за многопоточности, превенций и общих ресурсов. Это требует более глубокого анализа, чтобы помочь решить «неуловимые» ошибки и проблемы с производительностью.
Трассировка в основном используется для анализа покрытого тестами кода
Трассировка действительно используется для анализа покрытого тестами кода, но для этого вы используете аппаратную трассировку на уровне инструкций. Трассировка на основе программного обеспечения — совсем другая вещь, ориентированная только на соответствующие события программного обеспечения и с любыми релевантными данными. Это более гибкий метод анализа, который может использоваться в широком диапазоне ситуаций, включая отладку, проверку и оптимизацию производительности.
Трассировка на основе программного обеспечения является ресурсоемким процессом и замедляет работу системы
Как упоминалось выше, в этом есть доля правды. Трассировка добавляет немного дополнительного кода в ваше приложение, как правило, несколько сотен тактовых циклов на каждое событие. Но поскольку вы регистрируете относительно небольшое количество событий (как правило, несколько тысяч в секунду), общий эффект часто близок к незначительному, как правило, на несколько процентов увеличивает загрузку процессора. Но отслеживание программного обеспечения может не подходить для каждой системы, если время цикла или временные требования измеряются в микросекундах, отслеживание программного обеспечения может быть слишком ресурсоемким.
Необходима специальная поддержка трассировки процессором и печатной платой
Это определенно верно для аппаратной трассировки, но трассировка на основе программного обеспечения не требует ничего конкретного от целевой системы. Большинство систем могут обеспечивать отслеживание в режиме «моментального снимка», то есть хранение данных во внутреннем буфере ОЗУ. Однако это ограничивает длину журнала логов доступной оперативной памятью, всего несколько секунд, если не использовать внешнюю DRAM. Для более длинных логов целевому устройству требуется довольно быстрое соединение с главным компьютером, например, порт отладки, сеть TCP / IP или соединение USB.
Для трассировки в буфер ОЗУ требуется большой объем ОЗУ
Не правда. Многие средства трассировки кодируют события в очень компактном формате. Например, записывающее устройство Percepio использует только 4-8 байтов на каждое событие и поддерживает режим кольцевого буфера, когда более старые данные перезаписываются при заполнении буфера. Он также может фильтровать данные логов в источнике, прежде чем записывать в буфер. Это делает логирование полезным даже на микроконтроллерах, у которых есть только несколько килобайт ОЗУ. Такой небольшой буфер трассировки не будет приобретать очень длинные логи, но вы можете отловить последние события, которые предшествовали текущему состоянию.