| HOW TO COLLECT KERNEL CODE COVERAGE FROM A TRADEFED TEST RUN |
| ============================================================ |
| |
| |
| ## Build and use a kernel with GCOV profile enabled |
| Build your kernel with the [`--gcov`](https://android.googlesource.com/kernel/build/+/refs/heads/main/kleaf/docs/gcov.md) option to enable |
| GCOV profiling from the kernel. This will also trigger the build to save the required *.gcno files needed to viewing the collected count data. |
| |
| For example to build a Cuttlefish (CF) kernel with GCOV profiling enabled run: |
| ``` |
| $ bazel run --gcov //common-modules/virtual-device:virtual_device_x86_64_dist |
| ``` |
| |
| ## Run your test(s) using tradefed.sh with kernel coverage collection enabled |
| 'tradefed.sh' can be used to run a number of different types of tests. Adding the appropriate coverage flags |
| to the tradefed call will trigger tradefed to take care of mounting debugfs, reseting the gcov counts prior |
| to test run, and the collection of gcov data files from debugfs after test completion. |
| |
| These coverage arguments are: |
| ``` |
| --coverage --coverage-toolchain GCOV_KERNEL --auto-collect GCOV_KERNEL_COVERAGE |
| ``` |
| |
| The following is a full example call running just the `kselftest_net_socket` test in the |
| selftests test suite that exists under the 'bazel-bin/common/testcases' directory. The artifact |
| output has been redirected to 'tf-logs' for easier reference needed in the next step. |
| ``` |
| $ prebuilts/tradefed/filegroups/tradefed/tradefed.sh run commandAndExit \ |
| template/local_min --template:map test=suite/test_mapping_suite \ |
| --include-filter 'selftests kselftest_net_socket' --tests-dir=bazel-bin/common/testcases/ \ |
| --primary-abi-only --log-file-path tf-logs \ |
| --coverage --coverage-toolchain GCOV_KERNEL \ |
| --auto-collect GCOV_KERNEL_COVERAGE |
| ``` |
| |
| ## Create an lcov tracefile out of the gcov tar artifact from test run |
| The previously mentioned tradefed run will produce a tar file artifact in the |
| tradefed log folder with a name similar to <test>_kernel_coverage_*.tar.gz. |
| This tar file is an archive of all the gcov data files collected into debugfs/ |
| from the profiled device. In order to make it easier to work with this data, |
| it needs to be converted to a single lcov tracefile. |
| |
| The script 'create-tracefile.py' facilitates this generation by handling the |
| required unpacking, file path corrections and ultimate 'lcov' call. |
| |
| An example where we generate a tracefile only including results from net/socket.c. |
| (If no source files are specified as included, then all source file data is used): |
| ``` |
| $ ./common/tools/testing/android/bin/create-tracefile.py -t tf-logs/ --include net/socket.c |
| ``` |
| |
| This will create a local tracefile named 'cov.info'. |
| |
| |
| ## Visualizing Results |
| With the created tracefile there a number of different ways to view coverage data from it. |
| Check out 'man lcov' for more options. |
| ### 1. Text Options |
| #### 1.1 Summary |
| ``` |
| $ lcov --summary --rc lcov_branch_coverage=1 cov.info |
| Reading tracefile cov.info_fix |
| Summary coverage rate: |
| lines......: 6.0% (81646 of 1370811 lines) |
| functions..: 9.6% (10285 of 107304 functions) |
| branches...: 3.7% (28639 of 765538 branches) |
| ``` |
| #### 1.2 List |
| ``` |
| $ lcov --list --rc lcov_branch_coverage=1 cov.info |
| Reading tracefile cov.info_fix |
| |Lines |Functions|Branches |
| Filename |Rate Num|Rate Num|Rate Num |
| ================================================================================ |
| [/usr/local/google/home/joefradley/dev/common-android-mainline-2/common/] |
| arch/x86/crypto/aesni-intel_glue.c |23.9% 623|22.2% 36|15.0% 240 |
| arch/x86/crypto/blake2s-glue.c |50.0% 28|50.0% 2|16.7% 30 |
| arch/x86/crypto/chacha_glue.c | 0.0% 157| 0.0% 10| 0.0% 80 |
| <truncated> |
| virt/lib/irqbypass.c | 0.0% 137| 0.0% 6| 0.0% 88 |
| ================================================================================ |
| Total:| 6.0% 1369k| 9.6% 0M| 3.7% 764k |
| ``` |
| ### 2. HTML |
| The `lcov` tool `genhtml` is used to generate html. To create html with the default settings: |
| |
| ``` |
| $ genhtml --branch-coverage -o html cov.info |
| ``` |
| |
| The page can be viewed at `html\index.html`. |
| |
| Options of interest: |
| * `--frame`: Creates a left hand macro view in a source file view. |
| * `--missed`: Helpful if you want to sort by what source is missing the most as opposed to the default coverage percentages. |
| |
| |
| |