blob: 74b98bf20fabda4aa83a3d0afd9d5f1f94a590a0 [file] [edit]
---
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.