blob: 5c68a4748587f8fcf9cea848a6f6fba4643a1396 [file] [log] [blame]
--
-- Copyright 2020 The Android Open Source Project
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- https://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
-- Table to map any of the various chrome process names to a type (e.g. Browser,
-- Renderer, GPU Process, etc).
DROP VIEW IF EXISTS all_chrome_processes;
CREATE VIEW all_chrome_processes AS
SELECT upid, IFNULL(pt.string_value, '') AS process_type
FROM process
-- A process is a Chrome process if it has a chrome.process_type arg.
-- The value of the arg may be NULL.
-- All Chromium producers emit chrome_process field in their process track
-- descriptor when Chromium track event data source is enabled.
-- So this returns all processes in Chrome traces, and a subset of processes
-- in system traces.
JOIN
(SELECT arg_set_id, string_value FROM args WHERE key = 'chrome.process_type')
pt
ON process.arg_set_id = pt.arg_set_id;
-- A view of all Chrome threads.
DROP VIEW IF EXISTS all_chrome_threads;
CREATE VIEW all_chrome_threads AS
SELECT utid, thread.upid, thread.name
FROM thread, all_chrome_processes
WHERE thread.upid = all_chrome_processes.upid;
-- For sandboxed and privileged processes (found in Android system traces), use
-- the main thread name to type of process.
DROP VIEW IF EXISTS chrome_subprocess_types;
CREATE VIEW chrome_subprocess_types AS
-- Sometimes you can get multiple threads in a trace marked main_thread, but
-- they appear to have the same name so just use one of them.
SELECT DISTINCT p.upid,
SUBSTR(t.name, 3, LENGTH(t.name) - 6) AS sandbox_type
FROM all_chrome_processes p
JOIN all_chrome_threads t ON p.upid = t.upid
WHERE process_type IN ("Sandboxed", "Privileged")
AND t.name GLOB "Cr*Main";
-- Contains all the chrome processes from process with an extra column,
-- process_type.
DROP VIEW IF EXISTS chrome_process;
CREATE VIEW chrome_process AS
SELECT PROCESS.*,
IIF(sandbox_type IS NULL, process_type, sandbox_type) AS process_type
FROM PROCESS
JOIN (
SELECT a.upid,
sandbox_type,
process_type
FROM all_chrome_processes a
LEFT JOIN chrome_subprocess_types s ON a.upid = s.upid
) c ON PROCESS.upid = c.upid;
-- Contains all the chrome threads from thread with an extra column,
-- canonical_name, that should contain a thread that's the same in both chrome
-- and system traces.
DROP VIEW IF EXISTS chrome_thread;
CREATE VIEW chrome_thread AS
SELECT thread.*,
CASE
WHEN thread.name GLOB "Cr*Main" THEN "CrProcessMain"
WHEN thread.name IS NULL THEN "Unknown"
ELSE thread.name
END AS canonical_name
FROM (
SELECT t.utid,
p.*
FROM all_chrome_threads t
JOIN chrome_process p ON t.upid = p.upid
) c
JOIN thread ON thread.utid = c.utid;