1-- 2-- Copyright 2024 The Android Open Source Project 3-- 4-- Licensed under the Apache License, Version 2.0 (the "License"); 5-- you may not use this file except in compliance with the License. 6-- You may obtain a copy of the License at 7-- 8-- https://www.apache.org/licenses/LICENSE-2.0 9-- 10-- Unless required by applicable law or agreed to in writing, software 11-- distributed under the License is distributed on an "AS IS" BASIS, 12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13-- See the License for the specific language governing permissions and 14-- limitations under the License. 15-- 16 17CREATE PERFETTO VIEW perf_sample_in(ts TIMESTAMP, dur LONG) 18AS 19SELECT ts, 0 AS dur FROM perf_sample; 20 21CREATE VIRTUAL TABLE span 22USING 23 SPAN_JOIN(perf_sample_in, slice PARTITIONED depth); 24 25CREATE PERFETTO TABLE slice_stack 26AS 27WITH 28 tmp AS ( 29 SELECT 30 ts, 31 parent_stack_id, 32 string_AGG(IIF(name = 'Main loop', 'main', name), ',') 33 OVER ( 34 PARTITION BY ts 35 ORDER BY depth ASC 36 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 37 ) AS stack 38 FROM span 39 ) 40SELECT ts, stack FROM tmp WHERE parent_stack_id = 0 ORDER BY TS ASC; 41 42CREATE PERFETTO TABLE perf_stack 43AS 44WITH 45 symbol AS ( 46 SELECT 47 id, 48 symbol_set_id, 49 replace(replace(name, '(anonymous namespace)::', ''), '()', '') AS name 50 FROM stack_profile_symbol 51 ), 52 symbol_agg AS ( 53 SELECT 54 id, 55 symbol_set_id, 56 string_agg(name, ',') 57 OVER ( 58 PARTITION BY symbol_set_id 59 ORDER BY id DESC 60 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 61 ) AS name 62 FROM symbol 63 WHERE name IN ('main', 'A', 'B', 'C', 'D', 'E') 64 ), 65 inline AS ( 66 SELECT symbol_set_id, name FROM symbol_agg WHERE id = symbol_set_id 67 ), 68 frame AS ( 69 SELECT f.id AS frame_id, i.name 70 FROM STACK_PROFILE_FRAME f, inline i 71 USING (symbol_set_id) 72 ), 73 child AS ( 74 SELECT 75 s.ts, 76 spc.id, 77 spc.parent_id, 78 name 79 FROM perf_sample s, stack_profile_callsite spc 80 ON (s.callsite_id = spc.id), 81 frame USING (frame_id) 82 UNION ALL 83 SELECT 84 child.ts, 85 parent.id, 86 parent.parent_id, 87 COALESCE(f.name || ',', '') || child.name AS name 88 FROM child, stack_profile_callsite parent 89 ON (child.parent_id = parent.id) 90 LEFT JOIN frame f 91 USING (frame_id) 92 ) 93SELECT ts, name AS stack FROM child WHERE parent_id IS NULL ORDER BY ts ASC; 94 95SELECT COUNT(*) AS misaligned_count 96FROM slice_stack s 97FULL JOIN perf_stack p 98 USING (ts) 99WHERE s.stack <> p.stack; 100