]>
Commit | Line | Data |
---|---|---|
d9154d11 GKH |
1 | ################################################ |
2 | ||
3 | Using GCC's code coverage tool, gcov, with udev | |
4 | ||
5 | ################################################ | |
6 | ||
7 | For more information on using gcov please see: | |
8 | ||
9 | http://gcc.gnu.org/onlinedocs/gcc/Gcov.html | |
10 | ||
11 | With that said, here is how to get code coverage analysis for udev files. | |
12 | Note that this was developed with udev version 024. | |
13 | ||
14 | - Make sure you've installed udev and that it is working properly. | |
15 | If you are having problems, refer to the README and HOWTO-udev_for_dev | |
16 | documents in udev tarball. I've also compiled a udev_for_dev | |
738e5c3f | 17 | toubleshooting document for Red Hat which can be found in: |
d9154d11 | 18 | |
738e5c3f | 19 | docs/rh_udev_for_dev.txt |
d9154d11 | 20 | |
738e5c3f | 21 | - execute make_gcov.sh from udev top level directory |
d9154d11 GKH |
22 | |
23 | ./make_gcov.sh | |
24 | ||
25 | This will compile udev with gcov support. Basically make_gcov.sh will | |
26 | run make but override the CFLAGS. It strips any optimization from | |
27 | CFLAGS in order for gcov to get correct code coverage analysis. It will | |
28 | also add the -fprofile-arcs and -ftest-coverage options which are the | |
29 | necessary flags needed to use gcov. | |
30 | ||
31 | make_gcov.sh will assume the same default parameters as the regular | |
32 | make but also accepts the same parameters. For example if you want | |
33 | to get code coverage analysis for udev with the DEBUG flag turned | |
34 | on, you would just execute: | |
35 | ||
36 | ./make_gcov.sh DEBUG=true | |
37 | ||
38 | There is one exception, gcov will not work with klibc as it does not | |
39 | compile cleanly with the -fprofile-arcs and -ftest-coverage flags. | |
40 | With this said it is pretty much useless to set the KERNEL_DIR flag | |
41 | when using make_gcov.sh as well. | |
42 | ||
43 | Don't be alarmed if you look into your udev directory and see that it | |
44 | has been polluted with a bunch of *.bb, *.bbg, *.da, and *.gcov files. | |
45 | gcov creates and uses these files to extract the code coverage info. | |
46 | ||
47 | - After running make_gcov.sh you need to install udev again. So basically, | |
48 | ||
49 | su to root | |
50 | make install | |
51 | ||
52 | - Then execute some udev tasks. You can run some udev tests, reboot, or | |
53 | do anything your little udev heart desires. Once you are satisfied, you | |
738e5c3f | 54 | can now see how much udev code was covered. I personally recommend just |
55 | running test/udev-test.pl for starters. | |
d9154d11 | 56 | |
738e5c3f | 57 | - To get the udev code coverage analysis, execute run_gcov.sh from udev top |
58 | level directory. You need to be root to do this. | |
d9154d11 GKH |
59 | |
60 | su to root | |
61 | ./run_gcov.sh | |
62 | ||
738e5c3f | 63 | - This creates udev_gcov.txt in the udev top level directory which holds all |
64 | the code coverage information. To see an example of the code coverage info | |
65 | after executing the udev-test.pl test, please see: | |
d9154d11 GKH |
66 | |
67 | http://developer.osdl.org/ogasawara/gcov_for_udev/udev_gcov.txt | |
68 | ||
69 | - Also, after having executed gcov on udev (ie executing run_gcov.sh) a | |
70 | *.gcov file is created for every file which contained code that was | |
71 | used. Looking at the *.gcov files, one will see what lines of code | |
72 | were hit, and what lines were missed. For, example if code in udev-add.c | |
73 | were executed, gcov then created a file called udev-add.c.gcov. And a | |
74 | portion of udev-add.c.gov might look like: | |
75 | ||
76 | static int get_major_minor(struct sysfs_class_device *class_dev, struct udevice *udev) | |
77 | 95 { | |
78 | 95 struct sysfs_attribute *attr = NULL; | |
79 | ||
80 | 95 attr = sysfs_get_classdev_attr(class_dev, "dev"); | |
81 | 95 if (attr == NULL) | |
82 | ###### goto error; | |
83 | dbg("dev='%s'", attr->value); | |
84 | ||
85 | 95 if (sscanf(attr->value, "%u:%u", &udev->major, &udev->minor) != 2) | |
86 | ###### goto error; | |
87 | dbg("found major=%d, minor=%d", udev->major, udev->minor); | |
88 | ||
89 | 95 return 0; | |
90 | error: | |
91 | ###### return -1; | |
92 | } | |
93 | ||
94 | Any line of code that is preceded by a "######" implies that the code | |
95 | was never hit during execution. | |
96 | ||
97 | - Once you are done with using gcov for udev and want to return to your | |
98 | normal use of udev. Simply, | |
99 | ||
100 | ./make_gcov.sh clean | |
101 | ||
102 | This will clean out all the *.bb, *.bbg, *.da, *.gcov files produced by gcov. | |
103 | It will also run a regular make clean on your udev directory. Then just run | |
104 | a regular make and make install and you are back to normal: | |
105 | ||
106 | make | |
107 | su to root | |
108 | make isntall |