blob: 53d16e4d0923c39927117d4f6e74ce35976a2938 [file] [log] [blame] [view]
# `GCOV`
When the flag `--gcov` is set, the build is reconfigured to produce (and keep)
`*.gcno` files.
For example:
```shell
$ tools/bazel build --gcov //common:kernel_aarch64
```
You may find the `*.gcno` files under the
`bazel-bin/<package_name>/<target_name>/<target_name>_gcno` directory,
where `<target_name>` is the name of the `kernel_build()`
macro. In the above example, the `.gcno` files can be found at
```
bazel-bin/common/kernel_aarch64/kernel_aarch64_gcno/
```
... or in `destdir`.
## Handling path mapping
After you boot up the kernel and [mount debugfs](https://docs.kernel.org/filesystems/debugfs.html):
```shell
$ mount -t debugfs debugfs /sys/kernel/debug
```
You may see gcno files under:
```
/sys/kernel/debug/gcov/<some_host_absolute_path_to_repository>/<some_out_directory>/common/<some_source_file>.gcno
```
To map between these paths to the host, consult the `gcno_mapping.<name>.json`
under `bazel-bin/`.
### GKI
In the above example, the file can be found after a build:
```shell
$ tools/bazel build --gcov //common:kernel_aarch64
[...]
$ cat bazel-bin/common/kernel_aarch64/gcno_mapping.kernel_aarch64.json
[...]
```
You may also find this file under `destdir`:
```shell
$ tools/bazel run //common:kernel_aarch64_dist -- --destdir=out/kernel_aarch64/dist
[...]
$ cat out/kernel_aarch64/dist/gcno_mapping.kernel_aarch64.json
[...]
```
### Device mixed builds
You need to consult the JSON file for the device `kernel_build`.
Using virtual device as an example, you may find the files under:
```shell
$ tools/bazel build --gcov //common-modules/virtual-device:virtual_device_x86_64
[...]
$ cat bazel-bin/common-modules/virtual-device/virtual_device_x86_64/gcno_mapping.virtual_device_x86_64.json
[...]
```
Or under `destdir`:
```shell
$ tools/bazel run --gcov //common-modules/virtual-device:virtual_device_x86_64_dist -- --destdir=out/vd/dist
[...]
$ cat out/vd/dist/gcno_mapping.virtual_device_x86_64.json
[...]
```
**Note**: You will also see `gcno_mapping.kernel_x86_64.json` under `destdir`. That file is incomplete
as it does not contain mappings for in-tree modules specific for virtual device.
### Sample content of `gcno_mapping.<name>.json`:
Without `--config=local` (see [sandboxing](sandbox.md)):
```json
[
{
"from": "/<repository_root>/out/bazel/output_user_root/.../__main__/out.../android-mainline/common",
"to": "bazel-out/.../kernel_x86_64/gcno"
}
]
```
With `--config=local` (see [sandboxing](sandbox.md)):
```json
[
{
"from": "/mnt/sdc/android/kernel/out/cache/.../common",
"to": "bazel-out/k8-fastbuild/bin/common/kernel_aarch64/gcno"
}
]
```
The JSON file contains a list of mappings. Each mapping indicates that the `.gcno` files
located in `<from>` were copied to `<to>`. Hence, `/sys/kernel/debug/<from>`
on the device maps to `<to>` on host.
**Note**: For both `<from>` and `<to>`, absolute paths should be interpreted as-is,
and relative paths should be interpreted as relative to the repository on host. For example:
```json
[
{
"from": "/absolute/from",
"to": "/absolute/to"
},
{
"from": "relative/from",
"to": "relative/to"
}
]
```
This means:
* Device `/sys/kernel/debug/absolute/from` maps to host `/absolute/to`
* Device `/sys/kernel/debug/<repositry_root>/relative/from` maps to host `/<repository_root>/relative/to`.