trace 검색

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

검색 시청자 탭

그림 1. 검색 뷰어 탭

검색 뷰어를 사용하면 Perfetto 트레이스에서 맞춤 SQL 쿼리를 작성하고 실행할 수 있으며 최근 쿼리와 저장된 쿼리에 액세스할 수 있습니다. Winscope는 SurfaceFlinger, 트랜잭션, 전환, ViewCapture 트레이스 검색을 지원하는 전문 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)로 표시됩니다.

Winscope는 추적별 테이블의 데이터를 Perfetto args 테이블과 조인하여 이러한 뷰를 만듭니다. 이러한 테이블을 직접 쿼리할 수 있습니다. args 테이블에서 key, flat_key, display_value 열은 각각 property, flat_property, value 뷰 열과 유사합니다.

args 표:

설명
arg_set_id 일련의 인수를 연결하는 데 사용됩니다.
flat_key 반복 필드를 고려하지 않은 프로토 메시지의 속성 이름
key 반복 필드를 고려한 프로토 메시지의 속성 이름
value_type 속성 값 유형
int_value 값 유형이 정수인 경우 속성 값
string_value 값 유형이 문자열인 경우 속성 값
real_value 값 유형이 실수인 경우 속성 값
display_value 문자열로 변환된 속성 값

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, ']')
        ),
        '%'
      )
    
  • 뒤로 스와이프 동작이 표시되는 모든 프레임 찾기

    SELECT DISTINCT STATE.ts FROM sf_layer_search STATE
      WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
    

데이터 표

SurfaceFlinger 뷰는 다음 기본 테이블을 사용하여 생성됩니다.

surfaceflinger_layers_snapshot:

설명
id 항목의 행 ID
ts 항목의 타임스탬프
arg_set_id args 테이블의 행을 이 항목과 연결하는 데 사용되는 ID입니다.

surfaceflinger_layer:

설명
id 레이어의 행 ID
snapshot_id 레이어가 속한 surfaceflinger_layers_snapshot의 항목 행 ID
arg_set_id args 테이블의 행을 이 레이어와 연결하는 데 사용되는 ID입니다.

트랜잭션 SQL 뷰

트랜잭션 proto 데이터는 TransactionTraceEntry 형식을 사용합니다.

트랜잭션 추적 데이터를 검색하려면 transactions_search 보기를 사용합니다. 이 뷰에는 다음 열이 포함됩니다.

설명
state_id 프로토 속성이 속한 항목의 행 ID
ts 프로토 속성이 속한 항목의 타임스탬프
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'
    

데이터 표

Transactions SQL 뷰는 다음 기본 테이블을 사용하여 생성됩니다.

surfaceflinger_transactions:

설명
id 항목의 행 ID
ts 항목의 타임스탬프
arg_set_id args 테이블의 행을 이 항목과 연결하는 데 사용되는 ID입니다.
vsync_id 이 항목의 모든 트랜잭션과 연결된 VSync ID

android_surfaceflinger_transaction:

설명
id 거래의 행 ID
snapshot_id 거래가 속한 surfaceflinger_transactions의 항목 행 ID
arg_set_id args 테이블의 행을 이 거래와 연결하는 데 사용되는 ID입니다.
transaction_id 프로토 메시지에서 가져온 거래 ID
pid 프로토 메시지에서 가져온 트랜잭션 PID
uid 프로토 메시지에서 가져온 트랜잭션 UID
layer_id 거래와 연결된 레이어의 ID(해당하는 경우)
display_id 거래와 연결된 디스플레이의 ID입니다(해당하는 경우).
flags_id android_surfaceflinger_transaction_flag에서 연결된 플래그를 검색하는 데 사용되는 ID입니다.
transaction_type 거래 유형

android_surfaceflinger_transaction_flag:

설명
flags_id android_surfaceflinger_transaction의 행에 있는 값에 해당합니다.
flag 번역된 플래그 문자열

개별 거래는 거래 유형에 따라 다양한 프로토 메시지 형식에서 args 표에 추가됩니다.

  • LAYER_ADDED: LayerCreationArgs 형식
  • LAYER_CHANGED: LayerState 형식
  • DISPLAY_ADDED: DisplayState 형식
  • DISPLAY_CHANGED: DisplayState 형식
  • LAYER_DESTROYED: 인수 없음
  • LAYER_HANDLE_DESTROYED: 인수 없음
  • DISPLAY_REMOVED: 인수 없음
  • NOOP: 인수 없음

트랜지션 SQL 뷰

트랜지션 프로토 데이터는 ShellTransition 형식을 사용합니다.

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

설명
ts 발송 시간입니다. 사용 가능한 경우 전송 시간으로 대체되고, 그렇지 않으면 0입니다.
transition_id 프로토 메시지에서 가져온 전환 ID
property 반복되는 필드를 고려한 속성 이름
flat_property 반복 필드를 고려하지 않는 속성 이름
value 프로토 메시지에서 가져온 트랜잭션 UID

쿼리 예

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

데이터 표

전환 뷰는 다음 기본 테이블을 사용하여 생성됩니다.

window_manager_shell_transitions:

설명
id 전환의 행 ID
ts 발송 시간입니다. 사용 가능한 경우 전송 시간으로 대체되고, 그렇지 않으면 0입니다.
transition_id 프로토 메시지에서 가져온 전환 ID
arg_set_id args 테이블의 행을 이 전환과 연결하는 데 사용되는 ID입니다.
transition_type 프로토 메시지에서 가져온 전환 유형
send_time_ns 프로토 메시지에서 가져온 전환 전송 시간
dispatch_time_ns 프로토 메시지에서 가져온 전환 디스패치 시간
duration_ns 시작 시간과 종료 시간을 사용할 수 있는 경우 전환 기간
handler 전환 핸들러: window_manager_shell_transition_handlers에서 번역 가져오기
status 전환 상태: played, merged 또는 aborted
flags 프로토 메시지에서 가져온 전환 플래그

window_manager_shell_transition_handlers:

설명
handler_id window_manager_shell_transitionshandler 열에 있는 값에 해당하는 ID
handler_name 문자열 번역

android_window_manager_shell_transition_participants:

설명
transition_id 원시 프로토 메시지에서 가져온 전환 ID
layer_id SurfaceFlinger 레이어 참여자의 ID
window_id WindowManager 컨테이너 참여자의 ID

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

데이터 표

ViewCapture 뷰는 다음 기본 테이블을 사용하여 생성됩니다.

android_viewcapture:

설명
id 항목의 행 ID
ts 항목의 타임스탬프
arg_set_id args 테이블의 행을 이 항목과 연결하는 데 사용되는 ID입니다.

android_viewcapture_view:

설명
id 뷰의 행 ID
snapshot_id 뷰가 속한 android_viewcapture의 항목 행 ID
arg_set_id args 테이블의 행을 이 뷰와 연결하는 데 사용되는 ID입니다.

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

쿼리 실행

검색 뷰어의 왼쪽에 있는 전역 검색 패널을 사용하여 검색어를 실행할 수 있습니다.

전역 검색 패널과 처음 상호작용하면 추적 검색이 초기화되고 Winscope에서 도우미 SQL 뷰를 만듭니다. 몇 초 정도 걸립니다. 트레이스 검색이 초기화되는 동안에는 타임라인을 사용할 수 없습니다.

쿼리를 시작하려면 검색창에 쿼리를 작성하고 검색 쿼리 실행을 클릭하거나 키보드에서 Enter 키를 눌러 실행합니다.

완료되면 결과 표가 가운데 패널에 표시됩니다. 검색창 아래에 쿼리가 표시되며 세션 간에 쿼리를 저장할 수 있는 필드가 있습니다.

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

검색 뷰어 왼쪽 패널

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

결과

모든 쿼리는 표 형식의 결과를 반환하며, 이 결과는 스크롤 가능한 뷰에 표시됩니다. 이 뷰는 트랜잭션 및 ProtoLog와 같은 로그 기반 트레이스 뷰어와 유사한 대화형 동작을 제공합니다.

검색 시청자 결과

그림 3. 시청자 결과를 검색합니다.

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

검색 타임라인

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