Что такое трассировка в программировании
Перейти к содержимому

Что такое трассировка в программировании

  • автор:

Учебники. Программирование для начинающих.

Programm.ws — это сайт, на котором вы можете почитать литературу по языкам программирования , а так-же посмотреть примеры работающих программ на С++, ассемблере, паскале и много другого..

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

Delphi для начинающих

Глава 13. Отладка программы

Трассировка программы

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

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

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

Для того чтобы начать трассировку, необходимо из меню Run выбрать команду Step over или Trace into. В результате в окне редактора кода будет выделена первая инструкция программы. Для того чтобы выполнить выделенную инструкцию, необходимо из меню Run выбрать команду Step over (нажать клавишу ) или Trace into (нажать клавишу ). После выполнения инструкции будет выделена следующая. Таким образом, выбирая нужную команду из меню Run, можно выполнить трассировку программы.

Активизировать и выполнить трассировку можно при помощи функциональной клавиатуры. Команде Step over соответствует клавиша , а команде Trace into — клавиша .

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

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

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

Трассировка (программирование)

В информатике время выполнения (англ. runtime, сл. «ранта́йм») — это время, в течение которого выполняется программа, в отличие от других этапов жизненного цикла (англ. program lifecycle phase) программы, таких как время компиляции (англ. compile time), время установления связей («линковки») (англ. link time) и время загрузки (англ. load time).

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

Отла́дчик (деба́ггер, англ. debugger от bug) — компьютерная программа, предназначенная для поиска ошибок в других программах, ядрах операционных систем, SQL-запросах и других видах кода. Отладчик позволяет выполнять трассировку, отслеживать, устанавливать или изменять значения переменных в процессе выполнения кода, устанавливать и удалять контрольные точки или условия остановки и т.д.

Планирование выполнения задач — одна из ключевых концепций в многозадачности и многопроцессорности как в операционных системах общего назначения, так и в операционных системах реального времени. Планирование заключается в назначении приоритетов процессам в очереди с приоритетами. Программный код, выполняющий эту задачу, называется планировщиком (англ. task switcher, scheduler).

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

Упоминания в литературе

Изменение базы углов и перемена положительного направления отсчета углов отражается на многих параметрах работы AutoCAD, и, как уже было отмечено, менять настройки по умолчанию не рекомендуется. Дело в том, что эти изменения сказываются на способе ввода углов в командную строку, а также на отображении значений углов в палитре свойств объектов, окнах полярной трассировки, строке состояния и других элементах интерфейса.

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

• Renderer (Визуализатор) – на этой вкладке располагается свиток настроек некоторых настроек визуализатора Mental Ray. В частности, здесь можно установить параметры сглаживания, алгоритма визуализации, трассировки лучей, эффектов камеры, а также качество теней и смещения.

Связанные понятия (продолжение)

В императивном программировании порядок выполнения (порядок исполнения, порядок вычислений) — это способ упорядочения инструкций программы в процессе её выполнения.

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

Сопрограммы (англ. coroutines) — методика связи программных модулей друг с другом по принципу кооперативной многозадачности: модуль приостанавливается в определённой точке, сохраняя полное состояние (включая стек вызовов и счётчик команд), и передаёт управление другому. Тот, в свою очередь, выполняет задачу и передаёт управление обратно, сохраняя свои стек и счётчик.

Функция как услуга — архитектурный шаблон, предполагающий возможность вызова экземпляра управляющего кода без необходимости управления серверами и серверным приложением; ключевой компонент бессерверных вычислений. Одной из первых широко известных реализаций является представленный в 2014 году сервис AWS Lambda, аналогичные предложения среди публичных PaaS есть у Google (Cloud Functions), IBM (на Apache OpenWhisk в составе платформы Bluemix) и Microsoft (Azure Functions)

Внеочередное исполнение (англ. out-of-order execution) машинных инструкций — исполнение машинных инструкций не в порядке следования в машинном коде (как было при выполнении инструкций по порядку (англ. in-order execution)), а в порядке готовности к выполнению. Реализуется с целью повышения производительности вычислительных устройств. Среди широко известных машин впервые в существенной мере реализована в машинах CDC 6600 компании Control Data и IBM System/360 Model 91 компании IBM.

Резидентная программа (или TSR-программа, от англ. Terminate and Stay Resident — «завершиться и остаться резидентной») — в операционной системе MS-DOS программа, вернувшая управление оболочке операционной системы (command.com), либо надстройке над операционной системой (Norton Commander и т. п.), но оставшаяся в оперативной памяти персонального компьютера. Резидентная программа активизируется каждый раз при возникновении прерывания, вектор которого эта программа изменила на адрес одной из своих процедур.

Операционная система реального времени (ОСРВ, англ. real-time operating system, RTOS) — тип операционной системы, основное назначение которой — предоставление необходимого и достаточного набора функций для работы систем реального времени на конкретном аппаратном оборудовании.

Трассиро́вка печатных плат — один из этапов проектирования радиоэлектронной аппаратуры (РЭА), заключающийся в определении мест расположения проводников на печатной плате вручную или с использованием одной из САПР, предназначенной для проектирования печатных плат.

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

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

Хот-спот (англ. hotspot) — участок кода в программе, на который приходится бо́льшая часть исполняемых инструкций процессора или на исполнение которого процессор затрачивает очень много времени (одни инструкции исполняются быстрее, а другие — медленнее). Хот-споты могут являться узкими местами программы, если на них приходится лишняя нагрузка из-за неэффективности кода, — в таком случае они могут быть подвергнуты оптимизации.

Многозада́чность (англ. multitasking) — свойство операционной системы или среды выполнения обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких задач. Истинная многозадачность операционной системы возможна только в распределённых вычислительных системах.

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

Управление заданиями в UNIX-подобных операционных системах — комплекс средств по манипуляции пакетными заданиями оболочки UNIX, в частности, в интерактивном режиме, где «задание» — представление оболочки для группы процесса.

В компьютерных технологиях, программная транзакционная память (англ. software transactional memory, SТМ) представляет собой механизм управления параллелизмом, аналогичный механизму транзакций баз данных для управления доступом к совместно используемой памяти в параллельных вычислениях. Это альтернатива для синхронизации на основе блокировки. Транзакция в этом контексте является частью кода, который выполняет считывание и запись в разделяемую (совместно используемую) память. Считывание и запись логически.

Автоматическое распараллеливание — оптимизация программы компилятором, состоящая в автоматическом её преобразовании в форму, работающую на параллельном компьютере, например, на SMP или NUMA машине. Целью автоматизации распараллеливания является освобождение программиста от трудоемкого и подверженного ошибкам процесса ручного распараллеливания. Несмотря на то, что качество автоматического распараллеливания улучшалось последние годы, полное распараллеливание последовательных программ остается слишком.

Перехват (англ. hooking) — технология, позволяющая изменить стандартное поведение тех или иных компонентов информационной системы.

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

Модуль предсказания переходов (прогнозирования ветвлений) (англ. branch prediction unit) — устройство, входящее в состав микропроцессоров, имеющих конвейерную архитектуру, предсказывающее, будет ли выполнен условный переход в исполняемой программе. Предсказание ветвлений позволяет сократить время простоя конвейера за счёт предварительной загрузки и исполнения инструкций, которые должны выполниться после выполнения инструкции условного перехода. Прогнозирование ветвлений играет критическую роль, так.

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

Мультипрограммирование — способ организации выполнения нескольких программ на одном компьютере.

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

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

Регрессио́нное тести́рование (англ. regression testing, от лат. regressio — движение назад) — собирательное название для всех видов тестирования программного обеспечения, направленных на обнаружение ошибок в уже протестированных участках исходного кода. Такие ошибки — когда после внесения изменений в программу перестаёт работать то, что должно было продолжать работать, — называют регрессионными ошибками (англ. regression bugs).

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

Отложенная (ленивая) инициализация (англ. Lazy initialization) — приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Таким образом, инициализация выполняется «по требованию», а не заблаговременно. Аналогичная идея находит применение в самых разных областях: например, компиляция «на лету» и логистическая концепция «Точно в срок».

Блок инициализации (initialization block) — понятие в объектно-ориентированном программировании, в основном известное из языка Java, которое представляет собой последовательность команд, выполняемых при создании (загрузке) классов и объектов. Разработано, чтобы значительно увеличить мощность конструктора. Существуют два типа: статический блок инициализации, обычно называемый для краткости статический блок (static block), и динамический блок инициализации (instance block).

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

Межпроцедурная оптимизация (англ. Interprocedural Optimization, IPO), или полнопрограммная оптимизация программ (англ. whole program optimization) — оптимизация компилятора, которая использует глобальный анализ потока управления и затрагивает множество процедур, даже находящихся в разных модулях, за счёт чего может достигаться существенный прирост быстродействия.

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

Программа входа в систему — компонент операционной системы Microsoft Windows, отвечающий за вход в систему.

Активный объект (англ. Active object) — это шаблон проектирования, который отделяет поток выполнения метода от потока, в котором он был вызван.

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

Доказательство активности с ограниченным доверием (англ. Limited Confidence Proof-of-Activity (LCPoA)) — метод защиты цепочки блоков в блокчейн системах, основанный на модификации алгоритма Proof-of-Work, в сторону уменьшения расхода вычислительных ресурсов — требуется подбор хеша блока, но в качестве дополнительного значения nonce используется текущая метка времени .

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

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

Удалённые вычисления (англ. remote evaluation) — техника межкомпьютерной коммуникации, при которой один компьютер посылает другому запрос на выполнение некоторых действий в форме исполняемой программы с последующим запросом результата.

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

Пакетное задание (англ. batch job) — способ запуска задач на исполнение для избегания простоев вычислительных систем. Фактически представляет собой список запускаемых программ с указанием параметров запуска и входных данных. Задачи запускаются последовательно. Концепция была разработана примерно в 1960-х годах и до сих пор применяется в некоторых операционных системах, в частности, на мейнфреймах производства IBM.

Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter, UART) — узел вычислительных устройств, предназначенный для организации связи с другими цифровыми устройствами. Преобразует передаваемые данные в последовательный вид так, чтобы было возможно передать их по одной физической цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применяется в компьютерной технике (особенно во встраиваемых устройствах и системах.

В криптографии ‘время атаки (англ. Time attack) — это атака по сторонним каналам, в которой атакующий пытается скомпрометировать криптосистему с помощью анализа времени, затрачиваемого на исполнение криптографических алгоритмов. Каждая логическая операция требует времени на исполнение на компьютере, и это время может различаться в зависимости от входных данных. Располагая точными измерениями времени для разных операций, атакующий может восстановить входные данные.

Руткит (англ. rootkit, то есть «набор root-а») — набор программных средств (например, исполняемых файлов, скриптов, конфигурационных файлов), обеспечивающих.

Сетевое исчисление (англ., Network Calculus) — это совокупность математических результатов, которые позволяют исследовать граничные значения характеристик функционирования таких сложных технических систем, как сети связи, цифровые электрические цепи, конкурирующие программы. Сетевое исчисление даёт теоретическую основу для анализа гарантированной производительности телекоммуникационных пакетных сетей. Потоки трафика, проходящие через сеть, имеют различные ограничения, обусловленные такими свойствами.

Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы, наборы из одного или более программных модулей вместе с соответствующими управляющими данными, процедурами использования и обработки.

Команда (англ. Command) — поведенческий шаблон проектирования, используемый при объектно-ориентированном программировании, представляющий действие. Объект команды заключает в себе само действие и его параметры.

Трассировка и оборудование приложений

Трассировка — это мониторинг выполнения запущенного приложения. Вы можете добавить инструментирование трассировки и отладки в свое приложения .NET Framework при его разработке; кроме того, вы можете использовать это инструментирование при разработке приложения и после его развертывания. С помощью классов System.Diagnostics.Trace, System.Diagnostics.Debug и System.Diagnostics.TraceSource можно записывать сведения об ошибках и выполнении приложения в журналы, текстовые файлы или на другие устройства для последующего анализа.

Термин инструментирование относится к возможности мониторинга и измерения уровня производительности продукта и диагностики ошибок. В программировании это означает способность приложения включать следующие возможности.

  • Трассировка кода — получение информационных сообщений о работе приложения во время выполнения.
  • Отладка — отслеживание и устранение ошибок программирования в приложении при разработке. Дополнительные сведения см. в разделе Отладка.
  • Счетчики производительности — компоненты, позволяющие отслеживать производительность приложения. Дополнительные сведения см. в статье Performance Counters.
  • Журналы событий — компоненты, позволяющие получать и отслеживать основные события при выполнении приложения. Дополнительные сведения см. в описании класса EventLog.

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

Класс TraceSource предоставляет улучшенные функции трассировки и может использоваться вместо статических методов более старых классов трассировки Trace и Debug. Знакомые классы Trace и Debug по-прежнему широко используются, однако рекомендуется использовать класс TraceSource для новых команд трассировки, таких как TraceEvent и TraceData.

Классы Trace и Debug идентичны, за исключением того, что процедуры и функции класса Trace по умолчанию компилируются в сборки выпуска, а процедуры и функции класса Debug — нет.

Классы Trace и Debug предоставляют средства для мониторинга и исследования производительности приложения как во время разработки, так и после развертывания. Например, возможно использование класса Trace для отслеживания в развернутом приложении отдельных типов действий по мере их выполнения (например, создание новых подключений к базе данных) и последующего мониторинга производительности приложения.

Отладка и трассировка кода

Использование методов вывода класса Debug при разработке приложения позволяет отображать сообщения в окне вывода, доступном в интегрированной среде разработки Visual Studio. Пример:

Trace.WriteLine("Hello World!") Debug.WriteLine("Hello World!") 
System.Diagnostics.Trace.WriteLine("Hello World!"); System.Diagnostics.Debug.WriteLine("Hello World!"); 

В каждом из этих примеров будет отображаться сообщение Hello World! в окне вывода при запуске приложения в отладчике.

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

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

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

Этапы трассировки кода

Существует три этапа трассировки кода.

  1. Инструментирование — добавление кода трассировки в приложение.
  2. Трассировка — код трассировки записывает сведения в указанный целевой объект.
  3. Анализ — оценка сведений трассировки для определения и понимания проблем в приложении.

Во время разработки все методы вывода трассировки и отладки записывают сведения в окне вывода Visual Studio по умолчанию. В развернутом приложении эти методы записывают сведения трассировки в указанные целевые объекты. Дополнительные сведения об указании целевого объекта выходных данных трассировки и отладки см. в разделе Прослушиватели трассировки.

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

Использование трассировки в приложении
  1. Обдумайте, какие выходные данные трассировки вы хотите получить на месте после развертывания приложения.
  2. Создайте набора переключателей. Дополнительные сведения см. в статье How to: Configure Trace Switches (Настройка переключателей трассировки).
  3. Добавьте операторы трассировки в код приложения.
  4. Определите, где вы хотите получать выходные данные трассировки, и добавьте соответствующие прослушиватели. Дополнительные сведения см. в разделе Создание и инициализация прослушивателей трассировки.
  5. Выполните тестирование и отладку своего приложения и содержащегося в нем кода трассировки.
  6. Скомпилируйте приложение в исполняемый код с помощью одной из следующих процедур.
    • Используйте меню Сборка со страницей Отладка диалогового окна Страницы свойств в обозревателе решений. Используйте эту процедуру при компиляции в Visual Studio. — или —
    • Используйте директивы компилятора Trace и Debug для компиляции из командной строки. Дополнительные сведения см. в разделе Условная компиляция с использованием атрибутов Trace и Debug. Используйте эту процедуру при компиляции из командной строки.
  7. Если во время выполнения возникает проблема, включите соответствующий переключатель трассировки. Дополнительные сведения см. в разделе Настройка переключателей трассировки. Код трассировки записывает сообщения трассировки в указанный целевой объект, например в экран, текстовый файл или журнал событий. Тип прослушивателя, включенного в коллекцию, Trace.Listeners определяет целевой объект.
  8. Проанализируйте сообщения трассировки, чтобы обнаружить и понять проблемы в приложении.

Инструментирование трассировки и распределенные приложения

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

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

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

Стратегическое размещение операторов трассировки

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

Выходные данные трассировки

Выходные данные трассировки собираются объектами, которые называются прослушивателями. Прослушиватель — это объект, который принимает выходные данные трассировки и записывает их в устройство вывода (обычно это окно, журнал или текстовый файл). При создании прослушиватель трассировки, как правило, добавляется к коллекции Trace.Listeners, что позволяет ему получать все выходные данные трассировки.

Сведения трассировки всегда записываются как минимум в целевой объект вывода Trace по умолчанию, DefaultTraceListener. Если по каким-то причинам объект DefaultTraceListener был удален, а другие прослушиватели не были добавлены в коллекцию Listeners, сообщения трассировки получены не будут. Дополнительные сведения см. в разделе Прослушиватели трассировки.

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

Метод Выходные данные
Assert Указанный текст; если ничего не указано, то стек вызовов. Выходные данные записываются, только если условие, указанное в качестве аргумента в операторе Assert , имеет значение false.
Fail Указанный текст; если ничего не указано, то стек вызовов.
Write Указанный текст.
WriteIf Указанный текст, если условие, указанное в качестве аргумента в операторе WriteIf , выполнено.
WriteLine Заданный текст и возврат каретки.
WriteLineIf Указанный текст и каретки возвращаются, если выполняется условие, указанное в качестве аргумента WriteLineIf в операторе .

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

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

Методы Write и WriteLine всегда записывают указанный текст. Assert , WriteIf и WriteLineIf требуют логического аргумента, который определяет, пишет ли указанный текст; они записывают указанный текст только в том случае, если выражение имеет значение true (для WriteIf и WriteLineIf ) или false (для Assert ). Метод Fail всегда записывает указанный текст. Дополнительные сведения см. в разделе Практическое руководство. Добавление операторов трассировки в код приложения и в справочнике по .NET Framework.

Проблемы безопасности

Если не отключить трассировку и отладку перед развертыванием приложения ASP.NET, то приложение может отображать сведения о себе, которые могут использоваться вредоносными программами. Дополнительные сведения см. в разделах Практическое руководство. Условная компиляция с использованием атрибутов Trace и Debug, Компиляция и сборка и Практическое руководство. Создание, инициализация и настройка переключателей трассировки. Отладка также настраивается через службы IIS.

См. также раздел

  • Trace
  • TraceSource
  • Контракты для кода
  • Типы проектов C#, F# и Visual Basic
  • Практическое руководство. Добавление операторов трассировки в код приложения
  • Практическое руководство. Условная компиляция с использованием атрибутов Trace и Debug.
  • Практическое руководство. Создание, инициализация и настройка переключателей трассировки
  • Практическое руководство. Создание и инициализация источников трассировки
  • Практическое руководство. Использование TraceSource и фильтров с прослушивателями трассировки
  • Прослушиватели трассировки
  • Переключатели трассировки

Совместная работа с нами на GitHub

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

Просто о сложном: трассировки в микросервисах

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

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

Материал будет полезен начинающим разработчикам. Из него вы узнаете, как с небольшими усилиями подключить трассировки к своему проекту. Речь пойдет об инструменте из большого блока «‎Наблюдаемость» (Monitoring), а конкретно — о трассировках.

Что такое трассировка?

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

Трассировки оперируют понятиями span и trace. Span — это некоторое действие, которое содержит в себе следующие части:

  • название сервиса;
  • уникальный ID;
  • ID родительского спана;
  • название вызываемого метода;
  • время начала и окончания.

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

Чем она полезна?

Трассировка помогает обнаружить узкие места в производительности. Это возможно благодаря следующим функциям:

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

Архитектура Jaeger

Также стоит упомянуть о Jaeger. Jaeger — это платформа распределенной трассировки с открытым исходным кодом, созданная Uber еще в 2015 году. Она состоит из инструментальных SDK, серверной части для сбора и хранения данных, пользовательского интерфейса для визуализации данных и платформы Spark/Flink для совокупного анализа трассировки.

Основные части платформы:

  1. Инструментальный SDK — библиотеки, необходимые для сбора метрик.
  2. Jaeger-agent — локальный агент. Если агента нет, то трейсы всех сервисов на этой машине обычно выключены.
  3. Jaeger-collector — в него все агенты посылают собранные трейсы, а он кладет их в выбранную БД.
  4. Jaeger-query — сервис, который ходит в базу данных и отдает уже собранные трейсы для анализа.
  5. Jaeger-ui — веб-интерфейс для поиска и просмотров трейсов. Он ходит в Jaeger-query.

Локальный запуск Jaeger при помощи Docker в приложениях Spring Boot

Для начала создадим два простых сервиса — Consumer и Producer. Первый будет обращаться по http ко второму, получать слово “hello” и выводить слово “hello-world”.

Рассмотрим контроллер первого сервиса — Consumer. Все стандартно — RestController, GetMapping, Lombok и т.д., кроме feignClient. Способы взаимодействия между сервисами — тема не этой статьи, но в нашем случае используется обычный feignClient. В двух словах, spring-cloud-starter-openfeign позволяет с минимальными усилиями обеспечить сетевое взаимодействие между сервисами.

@RestController @RequiredArgsConstructor public class ConsumerController < private final ProducerFeign producerFeign; @GetMapping(value = "/hello-world") public String getHelloWorld() < return producerFeign.getHello() + " world"; >>

Обратимся к клиенту. При обращении к методу getHello() по localhost:8081/hello получаем слово “hello”.

@FeignClient(name = "producer-feign", url = "localhost:8081") public interface ProducerFeign < @GetMapping(value = "/hello") String getHello(); >

Контроллер нашего второго сервиса (клиента, к которому обращается первый) — Producer.

@RestController @RequiredArgsConstructor public class ProducerController < @GetMapping(value="/hello") public String getHello() < return "hello"; >>

Локальный запуск Jaeger при помощи Docker

Jaeger поставляется в качестве готового образа Docker. Для запуска образа Jaeger выполняем следующее:

docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 14250:14250 \ -p 14268:14268 \ -p 14269:14269 \ -p 9411:9411 \ jaegertracing/all-in-one:1.6

Далее необходимо запустить наше приложение. В этом руководстве будет использован новый стандарт OpenTelemetry. Все, что нужно сделать — это запустить jar-приложение с параметром javaagent.

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

Стандарт, по сути, представляет собой некую прослойку между потребителями метрик/трейсов и их поставщиками.

В документации OpenTelemetry можно найти параметры, с которыми запускается jar (например, OTEL_TRACES_EXPORTER, OTEL_SERVICE_NAME и т.д.). Параметр Dotel.traces.exporter определяют куда opentelemetry будет складывать трейсы, в нашем случае это Jaeger.

Запуск первого сервиса:

java -javaagent:/opentelemetry-javaagent.jar -Dotel.traces.exporter=jaeger -Dotel.service.name=customer-consumer -jar customer-consumer-0.0.1-SNAPSHOT.jar

Запуск второго сервиса:

java -javaagent:/opentelemetry-javaagent.jar -Dotel.traces.exporter=jaeger -Dotel.service.name=customer-producer -jar customer-producer-0.0.1-SNAPSHOT.jar

Для перехода в пользовательский интерфейс Jaeger используем http://localhost:16686/

Вывод

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

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

Если вам интересна эта тема — сохраните полезные ссылки:

  • Документация по OpenTelemetry с дружелюбным пособием для начинающих: https://opentelemetry.io/
  • Документация по Jaeger: https://www.jaegertracing.io/

Спасибо за внимание!

Больше полезных материалов для backend-разработчиков мы также публикуем в наших соцсетях – ВК и Telegram.

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

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