AOSP native code coverage - no coverage data found

337 views
Skip to first unread message

Thomas F

unread,
Mar 15, 2021, 10:45:03 AM3/15/21
to android-platform
I am trying to get code coverage working for a native AOSP vendor application (aarch64) using LLVM's source-based code coverage, but I keep getting Failed to load coverage: No coverage data found when attempting to generate the report.

I enable coverage by passing the relevant flags like so (Android.mk):
----
# Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := coverage_test
LOCAL_PROPRIETARY_MODULE := true
LOCAL_CPPFLAGS += -std=c++17
LOCAL_CFLAGS += -fprofile-instr-generate -fcoverage-mapping
LOCAL_LDFLAGS += -fprofile-instr-generate
LOCAL_SRC_FILES += main.cpp
LOCAL_SHARED_LIBRARIES += liblog
# LOCAL_NATIVE_COVERAGE := true # I also tried this as a Hail Mary.
include $(BUILD_EXECUTABLE)
----

After building (and verifying the correct flags are actually passed), I push and run the application:
----
adb push coverage_test /vendor/bin/ && adb shell "LLVM_PROFILE_FILE=/data/tmp/coverage.raw /vendor/bin/coverage_test"
----


After running the program, a raw coverage file is clearly produced (so far so good), and after pulling it, here is how I process it using the coverage tools:
----
llvm-profdata merge coverage.raw -o coverage.data
llvm-cov report -instr-profile=coverage.data <build output dir>/coverate_test
----

which then produces said error: Failed to load coverage: No coverage data found.

If I take a look at the generated data (e.g. by exporting text instead of binary: llvm-profdata merge coverage.raw -o coverage.data --text, then I can clearly see that all the data is there.

Now for the strange part. If I build the exact same code outside of AOSP (for the same Android version), it works as expected, and a report is successfully generated. I should mention that the AOSP build is using Clang/LLVM 10, while my standalone toolchain is version 8, but I find it hard to believe that would be a factor.

My test application is simply a class Foobar with two methods add(int, int) and sub(int, int), and add() is called by main(). I print the result to ensure that the call is not optimized away. I have compared the data files from the two cases, and they are identical except that the order of entries is reversed (main is listed before Foobar::add) in one of them.

Any ideas why llvm-cov fails to find any coverage data for an application built in the AOSP tree by the Android build system?, even though the data is clearly there? What am I missing?

Best regards,
Thomas

Reply all
Reply to author
Forward
0 new messages