| --- | |
| Title: Skyframe Inspection with `bazel dump` | |
| --- | |
| Debugging Bazel's [Skyframe](/reference/skyframe) system can be complex: | |
| the dependencies between different values can be difficult to trace and it can | |
| be confusing to understand what edges exist in the system. However, if you are | |
| working on Bazel itself it is absolutely necessary to understand the | |
| interactions between the different components at this level. | |
| The [`bazel dump` command](/reference/command-line-reference#dump-options) with | |
| the [`--skyframe` | |
| argument](/reference/command-line-reference#dump-flag--skyframe) makes it | |
| possible to inspect the current contents of Skyframe and see what the actual | |
| underlying state is, separate from the higher-level information provided by | |
| [`bazel query`](/query/guide), [`bazel cquery`](/query/cquery), and [`bazel | |
| aquery`](/query/aquery) (which are implemented on top of Skyframe and can mutate | |
| the Skyframe state). | |
| **Note that the output of `bazel dump` is an implementation detail and may | |
| change at any time. If you write scripts around this format know that they may | |
| break on future Bazel versions.** | |
| The `--skyframe` flag takes an argument detailing what information to report: | |
| - `--skyframe=off`: The default, reports nothing. | |
| - [`--skyframe=summary`](#summary-mode): A count of the nodes and edges in | |
| Skyframe. | |
| - [`--skyframe=count`](#count-mode): A report on the number of values for each | |
| SkyFunction type. | |
| - [`--skyframe=keys`](#keys-mode): The keys in Skyframe. | |
| - [`--skyframe=value`](#value-mode): The full value in Skyframe. | |
| - [`--skyframe=deps`](#deps-mode): The dependencies of the value in Skyframe. | |
| - [`--skyframe=rdeps`](#reverse-deps-mode): Other values in Skyframe with a | |
| dependency on the value. | |
| ### Filtering by SkyKey | |
| Many of these modes (specifically `value`, `deps`, and `rdeps`) also consider the | |
| `--skykey_filter` flag, which will do a regex compare of the Java `toString()` | |
| value of a key to decide whether to include it in the report. The flag can be | |
| specified several times to give several regular expressions, including ones that | |
| start with a `-` character to act as exclusions instead of inclusions. | |
| The key is converted with the following format: | |
| `SKYFUNCTION_NAME:SkyKey.toString()`. Because many SkyKey implementations use | |
| `@AutoValue`, the format will then be `SkyKeyClass{field=value, field=value}`. | |
| Therefore, the SkyKey for the configured target for the Bazel binary would be | |
| something like `CONFIGURED_TARGET:ConfiguredTargetKey{label=//src:bazel-bin, | |
| config=BuildConfigurationKey[a3ed33ca825cecaab69d541c45e04267665be178055813d03b8dcded031fdf82]}`. | |
| Be sure to use regex escapes, and replace any comma characters with a `.` (which | |
| matches any character): | |
| - The `SkyKey.toString()` representation does not perform regex escaping. In the | |
| above example, the characters "{[]}" are all used in regular expressions and | |
| will need to be escaped when used with `--skykey_filter` (and possibly escaped | |
| from the shell, as well). | |
| - The format of the `--skykey_filter` flag will attempt to split values on a | |
| comma, so the flag `--skykey_filter=CONFIGURED_TARGET:.*//src:bazel-bin, | |
| config=.*a3ed33` would end up comparing every SkyKey against **two** regular | |
| expressions, `CONFIGURED_TARGET:.*//src:bazel-bin` and `config=.*a3ed33`. This | |
| will almost certainly match many more SkyKeys than intended (everything with | |
| configuration "a3ed33"). | |
| Because of this, be sure to use regex escapes and to replace any comma | |
| characters with a `.` (which matches any character). | |
| ## Summary Mode | |
| The output of `bazel dump --skyframe=summary` reports the number of nodes | |
| and edges currently present in Skyframe. Since each node and edge consumes | |
| memory in the Bazel process, it is safe to say that more nodes and edges means | |
| that more memory is in use, although since keys and values can have different | |
| sizes this is not exact. | |
| ## Count Mode | |
| The output of `bazel dump --skyframe=count` is the number of values for each | |
| SkyFunction type. There are several dozen of these available, but many have only | |
| a few values. | |
| Commonly used types are: | |
| - `CONFIGURED_TARGET`: The number of configured targets in Skyframe. | |
| - `ARTIFACT`: The number of output files known in Skyframe. | |
| - `PACKAGE`: The numbe of packages loading into Skyframe. | |
| - `BUILD_CONFIGURATION`: The number of distinct configurations. | |
| ## Keys Mode | |
| The `bazel dump --skyframe=keys --skykey_filter=FOO` command will show keys | |
| available that match the filter. This can be quite extensive unless the key is | |
| very specific. | |
| The format is one line per key, the result of calling `.toString()` on the key. | |
| This can be helpful to identify specific keys to investigate with | |
| [`--skyframe=value`](#value-mode), [`--skyframe=deps`](#deps-mode), or | |
| [`--skyframe=rdeps`](#reverse-deps-mode). | |
| ## Value Mode | |
| The `bazel dump --skyframe=value --skykey_filter=FOO` command will show all | |
| Skyframe keys and values where the key matches the filter. This can be quite | |
| extensive unless the key is very specific. | |
| In fact, there might be multiple keys, because the target `//src:bazel-bin` is | |
| configured twice, once in the top-level configuration and again in a | |
| test-trimmed version of the top-level configuration. | |
| The format for `bazel dump --skyframe=value` is one line for the key, one line | |
| for the value, and then a blank line before the next key/value pair. | |
| The value output is the result of calling `.toString()` on the `SkyValue`, and | |
| may be very long depending on the specific class and data. As an example, a | |
| typical `RuleConfiguredValueTarget` will frequently list all source and | |
| dependency files, as well as other data specific to the target. | |
| ## Deps Mode | |
| The output of `bazel dump --skyframe=deps` gives the set of SkyKeys that depend | |
| on each SkyKey reported. Again, it is very critical to specify `--skykey_filter` | |
| to reduce the number of keys reported. | |
| The dependencies are reported in dependency groups, which correspond to sets of | |
| keys that are requested in the same call during SkyFunction evaluation. | |
| ## Reverse Deps Mode | |
| The output of `bazel dump --skyframe=rdeps` gives all SkyKeys that are depended | |
| on by the reported SkyKey. Again, it is very critical to specify `--skykey_filter` | |
| to reduce the number of keys reported. | |
| The format of the output is the SkyKey, followed by indented lines with each | |
| depending SkyKey. Distinct keys have newlines between them to make clear where | |
| boundaries are and clarify the output. | |
| This is very useful to answer questions such as "Why is this key present in the | |
| Skyframe graph?", by using `--skykey_filter` and walking back up the graph with | |
| repeated `--skyframe=rdeps` calls until an unexpected SkyKey is present. | |