| Avi Drissman | dfd88085 | 2022-09-15 20:11:09 | [diff] [blame] | 1 | # Copyright 2018 The Chromium Authors |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 2 | # Use of this source code is governed by a BSD-style license that can be |
| 3 | # found in the LICENSE file. |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 4 | |
| 5 | python |
| Takuto Ikuta | 3ae0e03b | 2018-05-18 06:10:40 | [diff] [blame] | 6 | |
| Hans Wennborg | 75399ae | 2025-04-29 16:52:51 | [diff] [blame] | 7 | import gdb.printing |
| Takuto Ikuta | 3ae0e03b | 2018-05-18 06:10:40 | [diff] [blame] | 8 | import os |
| Tom Anderson | 838a2b6 | 2018-07-30 17:58:27 | [diff] [blame] | 9 | import subprocess |
| 10 | import sys |
| Takuto Ikuta | 3ae0e03b | 2018-05-18 06:10:40 | [diff] [blame] | 11 | |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 12 | compile_dirs = set() |
| Christian Biesinger | 3ab7c353 | 2019-10-15 15:03:49 | [diff] [blame] | 13 | src_dir = None |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 14 | |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 15 | def get_current_debug_file_directories(): |
| 16 | dir = gdb.execute("show debug-file-directory", to_string=True) |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 17 | dir = dir[ |
| 18 | len('The directory where separate debug symbols are searched for is "' |
| 19 | ):-len('".') - 1] |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 20 | return set(dir.split(":")) |
| 21 | |
| 22 | |
| 23 | def add_debug_file_directory(dir): |
| 24 | # gdb has no function to add debug-file-directory, simulates that by using |
| 25 | # `show debug-file-directory` and `set debug-file-directory <directories>`. |
| 26 | current_dirs = get_current_debug_file_directories() |
| 27 | current_dirs.add(dir) |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 28 | gdb.execute( |
| 29 | "set debug-file-directory %s" % ":".join(current_dirs), to_string=True) |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 30 | |
| 31 | |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 32 | def load_libcxx_pretty_printers(src_dir): |
| sbingler | 7f3a579 | 2023-11-06 05:19:21 | [diff] [blame] | 33 | libcxx_pretty_printers = os.path.join(src_dir, 'third_party', 'libc++', 'src', |
| 34 | 'utils', 'gdb', 'libcxx') |
| Tom Anderson | 838a2b6 | 2018-07-30 17:58:27 | [diff] [blame] | 35 | if not os.path.isdir(libcxx_pretty_printers): |
| 36 | return |
| 37 | sys.path.insert(1, libcxx_pretty_printers) |
| Matt Fysh | 34415f7 | 2020-05-01 02:29:44 | [diff] [blame] | 38 | from printers import register_libcxx_printer_loader |
| 39 | register_libcxx_printer_loader() |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 40 | |
| 41 | |
| 42 | def load_gdb_chrome(src_dir): |
| 43 | tools_gdb = os.path.join(src_dir, 'tools', 'gdb') |
| 44 | |
| 45 | sys.path.insert(1, tools_gdb) |
| 46 | import gdb_chrome |
| 47 | |
| 48 | gdb.execute('source %s' % os.path.join(tools_gdb, 'viewg.gdb')) |
| Tom Anderson | 838a2b6 | 2018-07-30 17:58:27 | [diff] [blame] | 49 | |
| 50 | |
| Christian Biesinger | 3ab7c353 | 2019-10-15 15:03:49 | [diff] [blame] | 51 | def set_src_dir(compile_dir): |
| 52 | global src_dir |
| 53 | git = subprocess.Popen( |
| 54 | ['git', '-C', compile_dir, 'rev-parse', '--show-toplevel'], |
| 55 | stdout=subprocess.PIPE, |
| 56 | stderr=subprocess.PIPE) |
| 57 | src_dir, _ = git.communicate() |
| 58 | if git.returncode: |
| 59 | return |
| 60 | if isinstance(src_dir, str): |
| 61 | src_dir = src_dir.rstrip() |
| 62 | else: |
| 63 | src_dir = src_dir.decode('utf-8').rstrip() |
| 64 | |
| Elly Fong-Jones | d93746d | 2023-02-22 17:34:12 | [diff] [blame] | 65 | # If there's no chrome directory in the repo root, we got the wrong git repo. |
| 66 | # The most common way to have this happen is to be in a git checkout of |
| 67 | # another project that vendors chromium in its own third_party directory. In |
| 68 | # that case, try falling back to the current working directory. |
| 69 | if not os.path.isdir(os.path.join(src_dir, 'chrome')): |
| 70 | src_dir = os.path.abspath(os.getcwd()) |
| 71 | |
| Christian Biesinger | 3ab7c353 | 2019-10-15 15:03:49 | [diff] [blame] | 72 | load_libcxx_pretty_printers(src_dir) |
| 73 | |
| 74 | load_gdb_chrome(src_dir) |
| 75 | |
| 76 | |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 77 | def newobj_handler(event): |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 78 | global compile_dirs |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 79 | compile_dir = os.path.dirname(event.new_objfile.filename) |
| 80 | if not compile_dir: |
| 81 | return |
| Tom Anderson | f06ac38 | 2019-04-10 03:49:38 | [diff] [blame] | 82 | if compile_dir in compile_dirs: |
| 83 | return |
| 84 | compile_dirs.add(compile_dir) |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 85 | |
| 86 | # Add source path |
| Takuto Ikuta | 3ae0e03b | 2018-05-18 06:10:40 | [diff] [blame] | 87 | gdb.execute("dir %s" % compile_dir) |
| 88 | |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 89 | # Need to tell the location of .dwo files. |
| 90 | # https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html |
| 91 | # https://crbug.com/603286#c35 |
| 92 | add_debug_file_directory(compile_dir) |
| 93 | |
| Christian Biesinger | 3ab7c353 | 2019-10-15 15:03:49 | [diff] [blame] | 94 | global src_dir |
| 95 | if not src_dir: |
| 96 | set_src_dir(compile_dir) |
| Tom Anderson | 838a2b6 | 2018-07-30 17:58:27 | [diff] [blame] | 97 | |
| Takuto Ikuta | 52fcb20 | 2018-05-24 21:19:22 | [diff] [blame] | 98 | |
| 99 | # Event hook for newly loaded objfiles. |
| 100 | # https://sourceware.org/gdb/onlinedocs/gdb/Events-In-Python.html |
| 101 | gdb.events.new_objfile.connect(newobj_handler) |
| 102 | |
| Tom Anderson | 5a1ce54 | 2019-03-08 20:19:27 | [diff] [blame] | 103 | gdb.execute("set environment CHROMIUM_GDBINIT_SOURCED=1") |
| 104 | |
| Christian Biesinger | f1facae | 2019-12-09 18:42:38 | [diff] [blame] | 105 | # GDB 9.1 adds a setting, disabled by default, to do multithreaded symbol |
| 106 | # loading. This is a major speed up for Chrome, so turn it on here. We |
| 107 | # use try..except to avoid displaying errors in earlier GDB versions. |
| 108 | try: |
| 109 | # unlimited means "number of cores" |
| David Grogan | 5b25ac78 | 2020-01-06 23:12:07 | [diff] [blame] | 110 | gdb.execute("maint set worker-threads unlimited") |
| Christian Biesinger | f1facae | 2019-12-09 18:42:38 | [diff] [blame] | 111 | except: |
| 112 | pass |
| 113 | |
| Takuto Ikuta | 3ae0e03b | 2018-05-18 06:10:40 | [diff] [blame] | 114 | end |