Документация Engee

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

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

SnoopCompile

SnoopCompile «перехватывает» информацию из компилятора Julia для анализа недействительных объектов и вывода типов. Для этого используется ряд внутренних компонентов в разных целях:

  • Регистрация недействительных объектов: Base.StaticData.debug_method_invalidation и ccall(:jl_debug_method_invalidation, ...): регистрируют различные режимы недействительности. Пользователи SnoopCompile временно включают эти функции, например при загрузке пакетов. Каждая из них выдает данные в стандартном формате журнала; для изменения формата журнала может потребоваться дополнительный запрос на вытягивание к SnoopCompile. SnoopCompile обрабатывает эти журналы и генерирует деревья недействительных объектов CodeInstance, которые связаны с конкретными изменениями в таблицах методов или привязках.

  • Наблюдение за выводом: ccall(:jl_set_newly_inferred, ...) и ccall(:jl_set_inference_entrance_backtraces, ...): используются для анализа того, как запускается процесс вывода. Основная цель — дать возможность средствам диагностики производительности выявлять источники TTFX. Второй из этих вызовов ccall записывает обратную трассировку при каждом входе в процесс вывода типов, чтобы SnoopCompile мог определить отправителя вызова с динамической диспетчеризацией. Это необходимо для определения «причины» для вывода нового типа. Функция jl_set_inference_entrance_backtraces принимает массив, в который будут записываться события входа в процесс вывода. Для каждого события вывода хранятся два последовательных элемента массива: сначала объект CodeInstance, а затем представление обратной трассировки. Таким образом, для N событий вывода массив будет содержать 2N элементов, расположенных следующим образом: [ci₁, bt₁, ci₂, bt₂, ..., ciₙ, btₙ]. Обратите внимание, что элементы обратной трассировки btᵢ содержат необработанные данные обратной трассировки, которые обычно необходимо обрабатывать с помощью stacktrace(Base._reformat_bt(btᵢ...)) для преобразования в пригодный для анализа формат трассировки стека.