| --- |
| 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. |
| |