Recherche de trace

Utilisez SQL pour trouver des états spécifiques dans les traces Winscope Perfetto. Utilisez le visualiseur Recherche global dans l'interface utilisateur Winscope pour exécuter des requêtes et visualiser les résultats tabulés:

Onglet "Afficheur de recherche"

Figure 1 : Onglet "Visionneuse de recherche".

L'outil de visualisation de la recherche vous permet d'écrire et d'exécuter des requêtes SQL personnalisées sur les traces Perfetto, et d'accéder aux requêtes récentes et enregistrées. Winscope fournit des vues SQL spécialisées pour faciliter la recherche de traces SurfaceFlinger et de transactions.

Utilisez les conventions suivantes pour toutes les vues:

  • Pour les colonnes property et flat_property:

    • Les noms de propriété sont en casse snake, par exemple visible_region à partir de LayerProto.
    • Une notation par points est utilisée pour représenter des propriétés imbriquées, par exemple visible_region.rect.

    • Les champs répétés dans property sont distingués par des crochets:

      Par exemple, dans deux instances du champ répété visible_region.rect, le champ top est représenté par visible_region.rect[0].top et visible_region.rect[1].top.

    • Les champs répétés dans flat_property sont indiscernables:

      Par exemple, dans deux instances du champ répété visible_region.rect, le champ top est représenté par visible_region.rect.top dans les deux instances.

  • Pour les colonnes value et previous_value:

    • Les valeurs booléennes sont représentées par '0' (False) ou '1' (True).

Vues SQL SurfaceFlinger

Les données proto SurfaceFlinger utilisent les formats suivants:

Pour rechercher des données de calque, utilisez la vue sf_layer_search. Cette vue comprend les colonnes suivantes:

Colonne Description
state_id Identifiant unique de l'entrée à laquelle appartient le calque
ts Code temporel de l'entrée à laquelle la couche appartient
layer_id ID du calque
parent_id ID de calque du parent
layer_name Nom du calque
property Nom de la propriété tenant compte des champs répétés
flat_property Le nom de la propriété ne tient pas compte des champs répétés
value Valeur de la propriété au format de chaîne
previous_value Valeur de la propriété de l'entrée précédente au format de chaîne

Pour rechercher des données racine de hiérarchie, utilisez la vue sf_hierarchy_root_search. Cette vue comprend les colonnes suivantes:

Colonne Description
state_id ID unique de l'entrée
ts Code temporel de l'entrée
property Nom de la propriété tenant compte des champs répétés
flat_property Le nom de la propriété ne tient pas compte des champs répétés
value Valeur de la propriété au format de chaîne
previous_value Valeur de la propriété de l'entrée précédente au format de chaîne

Exemples de requêtes

  • Recherchez tous les frames où la couche IME a des limites d'écran valides:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Recherchez tous les frames où le calque Taskbar color.a (alpha) change:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Recherchez tous les frames dont la limite inférieure Wallpaper est inférieure ou égale à 2 400:

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Répertoriez toutes les propriétés pour les écrans avec une pile de calques valide:

    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, ']')
        ),
        '%'
      )
    

Vue SQL des transactions

Les données proto de transaction utilisent le format TransactionTraceEntry.

Pour rechercher des données de transaction, utilisez la vue transactions_search. Cette vue inclut les colonnes suivantes:

Colonne Description
state_id ID unique de l'entrée à laquelle appartient la propriété proto
ts Code temporel de l'entrée à laquelle la propriété proto appartient
transaction_id ID de transaction, le cas échéant
property Nom de la propriété tenant compte des champs répétés
flat_property Le nom de la propriété ne tient pas compte des champs répétés
value Valeur de la propriété au format de chaîne

Exemples de requêtes

  • Recherchez le frame où une transaction a été appliquée pour modifier la position X du calque en -54,0:

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Recherchez le frame dans lequel la couche ImeContainer a été ajoutée:

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

Vue SQL des transitions

Les données proto de transition utilisent le format ShellTransition.

Pour rechercher des données de transition, utilisez la vue transitions_search. Cette vue inclut les colonnes suivantes:

Colonne Description
ts Heure d'envoi (si disponible, sinon 0)
transition_id ID de transition
property Nom de la propriété tenant compte des champs répétés
flat_property Le nom de la propriété ne tient pas compte des champs répétés
value Valeur de la propriété au format de chaîne

Exemples de requêtes

Recherchez les propriétés des transitions gérées par 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

Vue SQL ViewCapture

Les données du proto ViewCapture utilisent le format View.

Pour rechercher des données ViewCapture, utilisez la vue viewcapture_search. Cette vue inclut les colonnes suivantes:

Colonne Description
state_id Identifiant unique de l'état auquel appartient la vue
ts Code temporel de l'état auquel la vue appartient
package_name Nom du package
window_name Nom de la fenêtre
class_name Afficher le nom du cours
property Nom de la propriété tenant compte des champs répétés
flat_property Le nom de la propriété ne tient pas compte des champs répétés
value Valeur de la propriété au format de chaîne
previous_value Valeur de la propriété de l'état précédent au format chaîne

Exemples de requêtes

Recherchez tous les états lorsque SearchContainerView a été déplacé dans la direction Y:

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

Table SQL ProtoLog

Les données proto de ProtoLog utilisent le format ProtoLogMessage. Cette vue comprend les colonnes suivantes:

Colonne Description
ts Code temporel du journal
level Niveau de journalisation
tag Tag de groupe de journalisation
message Message de journal
stacktrace Trace de la pile (si disponible)
location Emplacement du code d'où provient le message

Exemples de requêtes

  • Recherchez tous les journaux contenant un message contenant transition:

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • Recherchez tous les journaux contenant des ID de transaction valides:

    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, '%');
    

Exécuter des requêtes

Lorsque vous utilisez le panneau de gauche, la recherche de trace commence. Cette opération prend quelques secondes. La chronologie n'est pas disponible au début.

Une fois la recherche de trace initialisée, saisissez une requête dans le champ de recherche, puis cliquez sur Exécuter la requête de recherche ou appuyez sur Entrée sur votre clavier pour l'exécuter.

Lorsque vous avez terminé, le tableau des résultats s'affiche dans le panneau central. Votre requête s'affiche sous le champ de recherche, avec un champ permettant de l'enregistrer entre les sessions.

Pour accéder aux requêtes enregistrées, cliquez sur l'onglet Enregistrées dans le panneau de gauche, et pour accéder aux requêtes récemment exécutées, cliquez sur l'onglet Récentes:

panneau de gauche du lecteur de recherche

Figure 2. Panneau de gauche de l'aperçu de recherche.

Résultats

Toutes les requêtes renvoient des résultats tabulés, affichés dans une vue à faire défiler avec un comportement interactif semblable aux visionneuses de traces basées sur les journaux, telles que Transactions et ProtoLog:

résultats de la recherche dans l&#39;aperçu

Figure 3. Résultats de la visionneuse de recherche.

Si le tableau obtenu contient une colonne ts, les valeurs de cette colonne sont interprétées comme des codes temporels et ajoutées à la superposition de chronologie en tant que nouvelle ligne d'entrées. Cliquez sur cette ligne et utilisez les flèches vers la gauche et vers la droite pour naviguer entre les entrées:

chronologie de la recherche

Figure 4. Calendrier de recherche.