trace 검색

SQL을 사용하여 Winscope Perfetto 트레이스에서 특정 상태를 찾습니다. Winscope UI의 글로벌 검색 뷰어를 사용하여 쿼리를 실행하고 표 형식의 결과를 시각화합니다.

검색 뷰어 탭

그림 1. 시청자 검색 탭

검색 보기를 사용하면 Perfetto 트레이스에서 맞춤 SQL 쿼리를 작성하고 실행하고 최근 쿼리 및 저장된 쿼리에 액세스할 수 있습니다. Winscope는 SurfaceFlinger 및 트랜잭션 트레이스를 검색하는 데 도움이 되는 특수 SQL 뷰를 제공합니다.

모든 뷰에 다음 규칙을 사용하세요.

  • propertyflat_property 열의 경우:

    • 속성 이름은 스네이크 표기법으로 작성됩니다(예: LayerProtovisible_region).
    • 점 표기법은 중첩된 속성을 나타내는 데 사용됩니다(예: visible_region.rect).

    • property의 반복되는 필드는 대괄호로 구분됩니다.

      예를 들어 반복되는 필드 visible_region.rect의 두 인스턴스 내에서 top 필드는 visible_region.rect[0].topvisible_region.rect[1].top로 표시됩니다.

    • flat_property의 반복 필드는 구분할 수 없습니다.

      예를 들어 반복된 필드 visible_region.rect의 두 인스턴스 내에서 top 필드는 두 인스턴스 모두에서 visible_region.rect.top로 표시됩니다.

  • valueprevious_value 열의 경우:

    • 불리언 값은 '0' (False) 또는 '1' (True)로 표시됩니다.

SurfaceFlinger SQL 뷰

SurfaceFlinger 프로토 데이터는 다음 형식을 사용합니다.

레이어 데이터를 검색하려면 sf_layer_search 뷰를 사용하세요. 이 뷰에는 다음 열이 포함됩니다.

설명
state_id 레이어가 속한 항목의 고유 ID입니다.
ts 레이어가 속한 항목의 타임스탬프
layer_id 레이어 ID
parent_id 상위 요소의 레이어 ID
layer_name 레이어 이름
property 반복되는 필드를 고려한 속성 이름
flat_property 반복되는 필드를 고려하지 않는 속성 이름
value 문자열 형식의 속성 값
previous_value 이전 항목의 속성 값(문자열 형식)

계층 구조 루트 데이터를 검색하려면 sf_hierarchy_root_search 보기를 사용하세요. 이 뷰에는 다음 열이 포함됩니다.

설명
state_id 항목의 고유 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'
    
  • Taskbar 레이어 color.a (알파)가 변경되는 모든 프레임을 찾습니다.

    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 속성이 속한 항목의 고유 ID입니다.
ts proto 속성이 속한 항목의 타임스탬프
transaction_id 거래 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 전환 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 뷰가 속한 상태의 고유 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

ProtoLog SQL 테이블

ProtoLog 프로토 데이터는 ProtoLogMessage 형식을 사용합니다. 이 뷰에는 다음 열이 포함됩니다.

설명
ts 로그의 타임스탬프
level 로그 수준
tag 로깅 그룹 태그
message 로그 메시지
stacktrace 스택 트레이스 (제공되는 경우)
location 메시지가 시작된 코드 위치

쿼리 예시

  • transition가 포함된 메시지가 있는 모든 로그를 찾습니다.

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • 유효한 트랜잭션 ID가 포함된 모든 로그를 찾습니다.

    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 키를 눌러 실행합니다.

완료되면 결과 표가 가운데 패널에 표시됩니다. 검색어는 검색창 아래에 표시되며 세션 간에 검색어를 저장할 수 있는 입력란이 있습니다.

왼쪽 패널에서 저장됨 탭을 클릭하여 저장된 쿼리에 액세스하고 최근 탭을 클릭하여 최근에 실행된 쿼리에 액세스할 수 있습니다.

검색 뷰어 왼쪽 패널

그림 2. 뷰어 왼쪽 패널에서 검색합니다.

결과

모든 쿼리는 표 형식의 결과를 반환하며, 이 결과는 Transactions 및 ProtoLog와 같은 로그 기반 트레이스 뷰어와 유사한 양방향 동작으로 스크롤 가능한 뷰에 표시됩니다.

검색 결과 보기

그림 3. 뷰어 검색 결과

결과 테이블에 ts 열이 포함된 경우 해당 열의 값이 타임스탬프로 해석되어 타임라인 오버레이에 새 항목 행으로 추가됩니다. 이 행을 클릭하고 왼쪽 및 오른쪽 화살표 키를 사용하여 항목 간에 이동합니다.

검색 타임라인

그림 4. 타임라인을 검색합니다.