Файлы System/bin Android 12. Справочник.


  Все     Команда     Скрипт     Служба     Приложение  

trigger_perfetto
Триггеры perfetto

Тип файла: команда
  Eng  

usage: trigger_perfetto TRIGGER...

  • -h|--help Показать это сообщение

       

    Комментарии

    В номинальных условиях сеанс трассировки имеет жизненный цикл, который просто соответствует вызову клиента командной строки `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».
  • Сочетание клавиш Ctrl+C, которое обычно вызывает корректное завершение трассировки, не распространяется ADB при использовании «adb shell perfetto», а только при использовании интерактивного сеанса на основе PTY через «adb shell».
  • На устройствах без рута до Android 12 конфигурация может быть передана только как `cat config | adb shell perfetto -c -` (-: stdin) из-за слишком строгих правил SELinux. Начиная с Android 12 `/data/misc/perfetto-configs` можно использовать для хранения конфигураций.
  • На устройствах до Android 10 adb не может напрямую тянуть
    `/data/misc/perfetto-traces`.
    Используйте `adb shell cat /data/misc/perfetto-traces/trace > trace`, чтобы обойти проблему.
  • При захвате более длинных трасс, т.е. в контексте тестов или CI используйте
    `PID=$(perfetto --background)`, а затем `kill $PID` для остановки.