| -- |
| -- 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) |
| ); |