0
votes

I have following AOSP project setup

1) I have test.cpp in (AOSP root directory)/vendor/myProject/test.cpp

2) In Android.mk i have used LOCAL_CFLAGS += -g -fprofile-arcs -ftest-coverage LOCAL_LDFLAGS += -lgcov

3) When I compile the code i get test.gcno in: (AOSP root directory)/out/target/product/generic/obj/EXECUTABLES/myProject_intermediates

4) Then i put the test on device (adb sync)

5) Then on device i have used following: export GCOV_PREFIX=/vendor
export GCOV_PREFIX_STRIP=13 (to strip down the un-necessary path)

6) I run the test ./system/bin/test and i get test.gcda file on device (shell) /vendor/test.gcda

7) I copy the test.gcda (from device) to my build directory (/out/target/product/generic/obj/EXECUTABLES/myProject_intermediates) where i already have test.gcno

8) Now i am in /out/target/product/generic/obj/EXECUTABLES/myProject_intermediates Then run gcov as follows:

(AOSP root directory)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcov test

For this i get output as follows:

File 'vendor/myProject/test.cpp' Lines executed:23.00% of 223

vendor/myProject/test.cpp:creating 'test.cpp.gcov'

vendor/myProject/test.cpp:cannot open source file

Can anybody help me on how to solve this. It says test.cpp:cannot open source file gcov is not generating complete report. I have also checked -b option by specifying the path to source as follows:

(AOSP root directory)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcov -b (AOSP root directory)/vendor/myProject test

It didn't worked.

I guess the problem is because of distributed files (gcno,gcda,test.cpp) in different directories.

Thanks

2

2 Answers

2
votes

Solution is while building the test in which directory you were, you should be in the same directory while running gcov later, then all the .gcov files will be created successfully.

For example:

Project directory : android/frameworks/Myproj
In this you have test.cpp and Android.mk

Then say suppose from android directory you'll build the app or test.cpp, i.e. android$

Then the *.gcno files will be present in android/out/Myproj_Intermediates/

You will get the *.gcda files by running app in device, you will bring that *.gcda files from device to folder android/out/Myproj_intermediates/

Now to run gcov on these:

You should be in the android directory (since you built app from there)

android$ ./prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-gcov \ -o out/Myproj_intermediates/ -a frameworks/Myproj/test.cpp -b -c

0
votes

There has been a better approach in AOSP for several months now.

  1. Add LOCAL_NATIVE_COVERAGE := true to your makefile.
  2. $ export NATIVE_COVERAGE := true
  3. Build, sync, run.
  4. $ acov

acov will pull all the coverage files off the device, put them in the right place, and lcov (iirc this will prompt you to install if you don't already have it), and generate and HTML report for you.