Диагностические средства, используемые экосистемой пакетов.
На этой странице описаны встроенные в 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ᵢ...))для преобразования в пригодный для анализа формат трассировки стека.