blob: 0915608ddbc9cf9724a60b7392d6132deb1e4a5d [file] [log] [blame]
--
-- Copyright 2019 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.
--
-- On Linux/Android perfetto profilers (heapprofd, traced_perf) record the
-- .note.gnu.build-id as build_id. Within Google, this can be used as a lookup
-- key for most cases, but not for Chrome/Webview. Chrome is special and stores
-- symbols indexed by "breadkpad module ID". Breakpad module ID can be derived
-- with the following formula:
-- base::StrCat({module_id->substr(6, 2), module_id->substr(4, 2),
-- module_id->substr(2, 2), module_id->substr(0, 2),
-- module_id->substr(10, 2), module_id->substr(8, 2),
-- module_id->substr(14, 2), module_id->substr(12, 2),
-- module_id->substr(16, 16), "0"});
-- See also https://source.chromium.org/chromium/chromium/src/+/main:services/tracing/public/cpp/stack_sampling/tracing_sampler_profiler.cc;l=603;drc=cba00174ca338153b9c4f0c31ddbabaac7dd38c7
-- Note that in SQL SUBSTR() indexes are 1-based, not 0 based.
DROP VIEW IF EXISTS mangled_stack_profile_mapping;
CREATE VIEW mangled_stack_profile_mapping AS
SELECT
id,
name,
build_id,
CASE ((name GLOB '*libmonochrome_64.so'
OR name GLOB '*libchrome.so'
OR name GLOB '*libmonochrome.so'
OR name GLOB '*libwebviewchromium.so'
OR name GLOB '*libchromium_android_linker.so'
) AND length(build_id) >= 40)
WHEN 0 THEN build_id
ELSE (
SUBSTR(build_id, 7, 2)
|| SUBSTR(build_id, 5, 2)
|| SUBSTR(build_id, 3, 2)
|| SUBSTR(build_id, 1, 2)
|| SUBSTR(build_id, 11, 2)
|| SUBSTR(build_id, 9, 2)
|| SUBSTR(build_id, 15, 2)
|| SUBSTR(build_id, 13, 2)
|| SUBSTR(build_id, 17, 16)
|| '0')
END AS google_lookup_id
FROM stack_profile_mapping;
DROP VIEW IF EXISTS unsymbolized_frames_view;
CREATE VIEW unsymbolized_frames_view AS
SELECT UnsymbolizedFrames_Frame(
'module', spm.name,
'build_id', spm.build_id,
'address', spf.rel_pc,
'google_lookup_id', spm.google_lookup_id
) AS frame_proto
FROM stack_profile_frame spf
JOIN mangled_stack_profile_mapping spm
ON spf.mapping = spm.id
WHERE spm.build_id != ''
AND spf.symbol_set_id IS NULL;
DROP VIEW IF EXISTS unsymbolized_frames_output;
CREATE VIEW unsymbolized_frames_output AS
SELECT UnsymbolizedFrames(
'frames',
(SELECT RepeatedField(frame_proto) FROM unsymbolized_frames_view)
);