trigger_perfetto Триггеры perfetto Тип файла: команда usage: trigger_perfetto TRIGGER... Комментарии В номинальных условиях сеанс трассировки имеет жизненный цикл, который просто соответствует вызову клиента командной строки `perfetto`: запись данных трассировки начинается, когда TraceConfig передается `perfetto`, и заканчивается, когда либо истекает `TraceConfig.duration_ms`, либо когда клиент cmdline завершает работу. Perfetto поддерживает альтернативный режим запуска или остановки трассировки, основанный на триггерах. Общая идея состоит в том, чтобы объявить в самой конфигурации трассировки: Зачем использовать триггеры? Почему нельзя просто запустить perfetto или убить (SIGTERM) его, когда это необходимо? Обоснованием всего этого является модель безопасности: в большинстве развертываний Perfetto (например, на Android) только привилегированные объекты (например, оболочка adb) могут настраивать/запускать/останавливать трассировку. В этом смысле приложения непривилегированы и не могут контролировать трассировку. Триггеры позволяют непривилегированным приложениям ограниченно контролировать жизненный цикл сеанса трассировки. Концептуальная модель: [_Service model_](/docs/concepts/service-model.md)), т. е. объект, которому обычно разрешено запускать трассировку (например, оболочка adb в Android), заранее объявляет, каковы возможные имена триггеров для трассировки и какие Они сделают. Триггеры можно сигнализировать через утилиту cmdline: bash /system/bin/trigger_perfetto "имя_триггера" или также запустив независимый сеанс трассировки, который использует только поле enable_triggers: «trigger_name» в конфигурации Существует два типа триггеров: #### Триггеры запуска Триггеры запуска позволяют активировать сеанс трассировки только после того, как произошло какое-либо значимое событие. Передача конфигурации трассировки с триггером START_TRACING приводит к тому, что сеанс трассировки остается бездействующим (т. е. не записывает никаких данных) до тех пор, пока сработал триггер или истекло время ожидания `trigger_timeout_ms`. `trace_duration_ms` и запущенные трассировки нельзя использовать одновременно. Пример конфига: ``протобуф # При попадании в "myapp_is_slow" трассировка начинает запись данных и будет # остановился через 5 секунд. trigger_config { триггер_режим: START_TRACING триггеры { имя: "myapp_is_slow" stop_delay_ms: 5000 } # Если ни один триггер не сработает, трассировка завершится без записи каких-либо данных # после 30 с. trigger_timeout_ms: 30000 } # Остальной конфиг как обычно. буферы { ... } источники данных { ... } ``` #### Стоп-триггеры Триггеры STOP_TRACING позволяют преждевременно завершить трассировку при срабатывании триггера. В этом режиме трассировка начинается сразу, как только клиент `perfetto` вызывается (как и в именных падежах). Триггер действует как сигнал преждевременной финализации. Это можно использовать для использования perfetto в режиме бортового самописца. Запустив трассировку с буферами, сконфигурированными в режиме `RING_BUFFER`, и триггерами `STOP_TRACING`, трассировка будет записана в цикле и завершена, когда будет обнаружено событие-виновник. Это ключ к событиям, основная причина которых находится в недавнем прошлом. (например, приложение обнаруживает медленную прокрутку или отсутствующий кадр). Пример конфига: ``протобуф # Если триггер не сработает, трассировка завершится через 30 с. trigger_timeout_ms: 30000 # При попадании в "missed_frame" трассировка останавливается через 1 с. trigger_config { trigger_mode: STOP_TRACING триггеры { имя: "missed_frame" stop_delay_ms: 1000 } } # Остальной конфиг как обычно. буферы { ... } источники данных { ... } ``` ## Андроид На Android есть некоторые предостережения относительно использования «adb shell». `/data/misc/perfetto-traces`. Используйте `adb shell cat /data/misc/perfetto-traces/trace > trace`, чтобы обойти проблему. `PID=$(perfetto --background)`, а затем `kill $PID` для остановки. |