^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) Using gcov with the Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) ================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) gcov profiling kernel support enables the use of GCC's coverage testing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) tool gcov_ with the Linux kernel. Coverage data of a running kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) is exported in gcov-compatible format via the "gcov" debugfs directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) To get coverage data for a specific file, change to the kernel build
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) directory and use gcov with the ``-o`` option as follows (requires root)::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) # cd /tmp/linux-out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) # gcov -o /sys/kernel/debug/gcov/tmp/linux-out/kernel spinlock.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) This will create source code files annotated with execution counts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) in the current directory. In addition, graphical gcov front-ends such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) as lcov_ can be used to automate the process of collecting data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) for the entire kernel and provide coverage overviews in HTML format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) Possible uses:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * debugging (has this line been reached at all?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * test improvement (how do I change my test to cover these lines?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * minimizing kernel configurations (do I need this option if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) associated code is never run?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) .. _gcov: https://gcc.gnu.org/onlinedocs/gcc/Gcov.html
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) .. _lcov: http://ltp.sourceforge.net/coverage/lcov.php
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) Preparation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) -----------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) Configure the kernel with::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) CONFIG_DEBUG_FS=y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) CONFIG_GCOV_KERNEL=y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) and to get coverage data for the entire kernel::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) CONFIG_GCOV_PROFILE_ALL=y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) Note that kernels compiled with profiling flags will be significantly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) larger and run slower. Also CONFIG_GCOV_PROFILE_ALL may not be supported
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) on all architectures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) Profiling data will only become accessible once debugfs has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) mounted::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) mount -t debugfs none /sys/kernel/debug
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) Customization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) -------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) To enable profiling for specific files or directories, add a line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) similar to the following to the respective kernel Makefile:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) - For a single file (e.g. main.o)::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) GCOV_PROFILE_main.o := y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) - For all files in one directory::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) GCOV_PROFILE := y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) To exclude files from being profiled even when CONFIG_GCOV_PROFILE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) is specified, use::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) GCOV_PROFILE_main.o := n
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) and::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) GCOV_PROFILE := n
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) Only files which are linked to the main kernel image or are compiled as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) kernel modules are supported by this mechanism.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) Files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) -----
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) The gcov kernel support creates the following files in debugfs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ``/sys/kernel/debug/gcov``
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) Parent directory for all gcov-related files.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) ``/sys/kernel/debug/gcov/reset``
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) Global reset file: resets all coverage data to zero when
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) written to.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ``/sys/kernel/debug/gcov/path/to/compile/dir/file.gcda``
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) The actual gcov data file as understood by the gcov
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) tool. Resets file coverage data to zero when written to.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) ``/sys/kernel/debug/gcov/path/to/compile/dir/file.gcno``
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) Symbolic link to a static data file required by the gcov
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) tool. This file is generated by gcc when compiling with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) option ``-ftest-coverage``.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) Modules
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) -------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) Kernel modules may contain cleanup code which is only run during
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) module unload time. The gcov mechanism provides a means to collect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) coverage data for such code by keeping a copy of the data associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) with the unloaded module. This data remains available through debugfs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) Once the module is loaded again, the associated coverage counters are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) initialized with the data from its previous instantiation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) This behavior can be deactivated by specifying the gcov_persist kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) parameter::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) gcov_persist=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) At run-time, a user can also choose to discard data for an unloaded
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) module by writing to its data file or the global reset file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) Separated build and test machines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ---------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) The gcov kernel profiling infrastructure is designed to work out-of-the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) box for setups where kernels are built and run on the same machine. In
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) cases where the kernel runs on a separate machine, special preparations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) must be made, depending on where the gcov tool is used:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) a) gcov is run on the TEST machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) The gcov tool version on the test machine must be compatible with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) gcc version used for kernel build. Also the following files need to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) copied from build to test machine:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) from the source tree:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) - all C source files + headers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) from the build tree:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) - all C source files + headers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) - all .gcda and .gcno files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) - all links to directories
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) It is important to note that these files need to be placed into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) exact same file system location on the test machine as on the build
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) machine. If any of the path components is symbolic link, the actual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) directory needs to be used instead (due to make's CURDIR handling).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) b) gcov is run on the BUILD machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) The following files need to be copied after each test case from test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) to build machine:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) from the gcov directory in sysfs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) - all .gcda files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) - all links to .gcno files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) These files can be copied to any location on the build machine. gcov
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) must then be called with the -o option pointing to that directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) Example directory setup on the build machine::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /tmp/linux: kernel source tree
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /tmp/out: kernel build directory as specified by make O=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /tmp/coverage: location of the files copied from the test machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) [user@build] cd /tmp/out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) [user@build] gcov -o /tmp/coverage/tmp/out/init main.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) Note on compilers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) -----------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) GCC and LLVM gcov tools are not necessarily compatible. Use gcov_ to work with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) GCC-generated .gcno and .gcda files, and use llvm-cov_ for Clang.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .. _gcov: https://gcc.gnu.org/onlinedocs/gcc/Gcov.html
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) .. _llvm-cov: https://llvm.org/docs/CommandGuide/llvm-cov.html
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) Build differences between GCC and Clang gcov are handled by Kconfig. It
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) automatically selects the appropriate gcov format depending on the detected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) toolchain.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) Troubleshooting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) ---------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) Problem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) Compilation aborts during linker step.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) Cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) Profiling flags are specified for source files which are not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) linked to the main kernel or which are linked by a custom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) linker procedure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) Solution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) Exclude affected source files from profiling by specifying
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) ``GCOV_PROFILE := n`` or ``GCOV_PROFILE_basename.o := n`` in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) corresponding Makefile.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) Problem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) Files copied from sysfs appear empty or incomplete.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) Cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) Due to the way seq_file works, some tools such as cp or tar
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) may not correctly copy files from sysfs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) Solution
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) Use ``cat`` to read ``.gcda`` files and ``cp -d`` to copy links.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) Alternatively use the mechanism shown in Appendix B.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) Appendix A: gather_on_build.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) ------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) Sample script to gather coverage meta files on the build machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) (see 6a):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .. code-block:: sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) KSRC=$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) KOBJ=$2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) DEST=$3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) if [ -z "$KSRC" ] || [ -z "$KOBJ" ] || [ -z "$DEST" ]; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) echo "Usage: $0 <ksrc directory> <kobj directory> <output.tar.gz>" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) KSRC=$(cd $KSRC; printf "all:\n\t@echo \${CURDIR}\n" | make -f -)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) KOBJ=$(cd $KOBJ; printf "all:\n\t@echo \${CURDIR}\n" | make -f -)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) find $KSRC $KOBJ \( -name '*.gcno' -o -name '*.[ch]' -o -type l \) -a \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) -perm /u+r,g+r | tar cfz $DEST -P -T -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) if [ $? -eq 0 ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) echo "$DEST successfully created, copy to test system and unpack with:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) echo " tar xfz $DEST -P"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) echo "Could not create file $DEST"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) Appendix B: gather_on_test.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) -----------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) Sample script to gather coverage data files on the test machine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) (see 6b):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) .. code-block:: sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) #!/bin/bash -e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) DEST=$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) GCDA=/sys/kernel/debug/gcov
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) if [ -z "$DEST" ] ; then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) echo "Usage: $0 <output.tar.gz>" >&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) TEMPDIR=$(mktemp -d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) echo Collecting data..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) find $GCDA -type d -exec mkdir -p $TEMPDIR/\{\} \;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) find $GCDA -name '*.gcda' -exec sh -c 'cat < $0 > '$TEMPDIR'/$0' {} \;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) find $GCDA -name '*.gcno' -exec sh -c 'cp -d $0 '$TEMPDIR'/$0' {} \;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) tar czf $DEST -C $TEMPDIR sys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) rm -rf $TEMPDIR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) echo "$DEST successfully created, copy to build system and unpack with:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) echo " tar xfz $DEST"