Поиск трассировки

Используйте SQL для поиска определенных состояний в трассировках Winscope Perfetto. Используйте средство просмотра глобального поиска в пользовательском интерфейсе Winscope для выполнения запросов и визуализации результатов в виде таблиц:

search viewer tab

Рисунок 1. Вкладка просмотра поиска.

Средство просмотра поиска позволяет писать и выполнять пользовательские SQL-запросы к трассировкам Perfetto, а также получать доступ к недавним и сохраненным запросам. Winscope предоставляет специализированные представления SQL для облегчения поиска трассировок SurfaceFlinger и транзакций.

Используйте следующие соглашения для всех представлений:

  • Для столбцов property и flat_property :

    • Имена свойств записываются в змеином регистре, visible_region из LayerProto .
    • Для представления вложенных свойств используется точечная нотация, visible_region.rect .

    • Повторяющиеся поля в property выделяются квадратными скобками:

      Например, в двух экземплярах повторяющегося поля visible_region.rect top поле представлено visible_region.rect[0].top и visible_region.rect[1].top .

    • Повторяющиеся поля в flat_property неразличимы:

      Например, в двух экземплярах повторяющегося поля visible_region.rect top поле представлено visible_region.rect.top в обоих экземплярах.

  • Для столбцов value и previous_value :

    • Логические значения представлены как '0' ( False ) или '1' ( True ).

Представления SQL SurfaceFlinger

Прото-данные SurfaceFlinger используют следующие форматы:

  • Данные слоя находятся в формате LayerProto .

  • Корневые данные иерархии имеют формат LayersSnapshotProto .

Для поиска данных слоя используйте представление sf_layer_search . Это представление включает в себя следующие столбцы:

Столбец Описание
state_id Уникальный идентификатор записи, которой принадлежит слой
ts Временная метка записи, которой принадлежит слой
layer_id Идентификатор слоя
parent_id Идентификатор родительского слоя
layer_name Имя слоя
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущей записи в строковом формате

Для поиска корневых данных иерархии используйте представление sf_hierarchy_root_search . Это представление включает в себя следующие столбцы:

Столбец Описание
state_id Уникальный идентификатор записи
ts Временная метка записи
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущей записи в строковом формате

Примеры запросов

  • Найдите все кадры, в которых слой IME имеет допустимые границы экрана:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Найдите все кадры, в которых изменяется color.a слоя Taskbar (альфа):

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Найдите все кадры, в которых нижняя граница Wallpaper меньше или равна 2400:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Перечислите все свойства дисплеев с допустимым стеком слоев:

    SELECT STATE.* FROM sf_hierarchy_root_search STATE_WITH_DISPLAY_ON
    INNER JOIN sf_hierarchy_root_search STATE
      ON STATE.state_id = STATE_WITH_DISPLAY_ON.state_id
      AND STATE_WITH_DISPLAY_ON.flat_property='displays.layer_stack'
      AND STATE_WITH_DISPLAY_ON.value!='4294967295'
      AND STATE.property LIKE CONCAT(
        SUBSTRING(
            STATE_WITH_DISPLAY_ON.property,
            0,
            instr(STATE_WITH_DISPLAY_ON.property, ']')
        ),
        '%'
      )
    

Представление транзакций SQL

Протоданные транзакций используют формат TransactionTraceEntry .

Для поиска данных о транзакциях используйте представление transactions_search . Это представление включает в себя следующие столбцы:

Столбец Описание
state_id Уникальный идентификатор записи, которой принадлежит свойство proto.
ts Временная метка записи, которой принадлежит свойство proto
transaction_id Идентификатор транзакции, если доступен
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате

Примеры запросов

  • Найдите кадр, в котором была применена транзакция для изменения позиции слоя x на -54,0:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Найдите кадр, в который был добавлен слой ImeContainer :

    SELECT ts FROM transactions_search
      WHERE flat_property='added_layers.name'
      AND value='ImeContainer'
    

Представление SQL переходов

Протоданные переходов используют формат ShellTransition .

Для поиска данных о переходах используйте представление transitions_search . Это представление включает в себя следующие столбцы:

Столбец Описание
ts Время отправки — возвращается ко времени отправки, если доступно, иначе 0
transition_id Идентификатор перехода
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате

Примеры запросов

Найдите свойства переходов, обрабатываемых DefaultMixedHandler :

  SELECT
    PROPS.ts,
    PROPS.transition_id,
    PROPS.property,
    PROPS.value
  FROM transitions_search HANDLER_MATCH
  INNER JOIN transitions_search PROPS
    ON HANDLER_MATCH.transition_id = PROPS.transition_id
  WHERE HANDLER_MATCH.property = 'handler'
    AND HANDLER_MATCH.value LIKE "%DefaultMixedHandler"
  ORDER BY PROPS.transition_id, PROPS.property

Представление ViewCapture SQL

Протоданные ViewCapture используют формат View .

Для поиска данных ViewCapture используйте представление viewcapture_search . Это представление включает в себя следующие столбцы:

Столбец Описание
state_id Уникальный идентификатор состояния, к которому принадлежит представление.
ts Временная метка состояния, к которому принадлежит представление
package_name Имя пакета
window_name Имя окна
class_name Посмотреть название класса
property Учет имени свойства для повторяющихся полей
flat_property Имя свойства не учитывает повторяющиеся поля
value Значение свойства в строковом формате
previous_value Значение свойства из предыдущего состояния в строковом формате

Примеры запросов

Найдите все состояния, когда SearchContainerView перемещался в направлении y:

  SELECT * FROM viewcapture_search
  WHERE class_name LIKE '%SearchContainerView'
    AND flat_property='translation_y'
    AND value!=previous_value

SQL-таблица ProtoLog

Протоданные ProtoLog используют формат ProtoLogMessage . Это представление включает в себя следующие столбцы:

Столбец Описание
ts Временная метка журнала
level Уровень журнала
tag Тег группы журналирования
message Записать сообщение
stacktrace Трассировка стека (если имеется)
location Местоположение кода, откуда исходит сообщение

Примеры запросов

  • Найдите все журналы с сообщением, содержащим transition :

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • Найдите все журналы, содержащие действительные идентификаторы транзакций:

    CREATE PERFETTO VIEW valid_tx_ids AS
      SELECT DISTINCT transaction_id FROM transactions_search
      WHERE transaction_id IS NOT NULL AND transaction_id != '0';
    
    SELECT TRANS.transaction_id, message FROM valid_tx_ids TRANS
    INNER JOIN protolog LOGS
      ON LOGS.message LIKE CONCAT('%', TRANS.transaction_id, '%');
    

Запуск запросов

При использовании левой панели запускается поиск трассировки. Это занимает несколько секунд. Пока он начинается, временная шкала недоступна.

После инициализации поиска трассировки введите запрос в поле поиска и нажмите «Выполнить поисковый запрос» или нажмите Enter на клавиатуре, чтобы запустить его.

По завершении на средней панели отобразится таблица результатов. Ваш запрос появится под полем поиска с полем для сохранения запроса между сеансами.

Вы можете получить доступ к сохраненным запросам, щелкнув вкладку «Сохраненные » на левой панели, а также получить доступ к недавно выполненным запросам, щелкнув вкладку «Последние» .

search viewer left panel

Рисунок 2. Левая панель средства поиска.

Результаты

Все запросы возвращают результаты в виде таблицы, отображаемые в прокручиваемом представлении с интерактивным поведением, аналогичным средствам просмотра трассировки на основе журналов, таким как Transactions и ProtoLog:

search viewer results

Рисунок 3. Результаты просмотра поиска.

Если результирующая таблица содержит столбец ts , значения в этом столбце интерпретируются как метки времени и добавляются на наложение временной шкалы как новая строка записей. Щелкните эту строку и используйте клавиши со стрелками влево и вправо для перемещения между записями:

search timeline

Рисунок 4. Временная шкала поиска.