Покрытие собственного кода AOSP - данные о покрытии не найдены
Я пытаюсь получить покрытие кода, работающее для собственного приложения поставщика AOSP (aarch64), используя покрытие кода на основе исходного кода LLVM, но я продолжаю получать при попытке создать отчет.
Я включаю покрытие, передавая соответствующие флаги, например (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)
После сборки (и проверки того, что действительно переданы правильные флаги), я нажимаю и запускаю приложение:
adb push <build output dir>/coverage_test /vendor/bin/ && adb shell "LLVM_PROFILE_FILE=/data/tmp/coverage.raw /vendor/bin/coverage_test"
Очевидно, что создается необработанный файл покрытия (пока все хорошо), и после его извлечения я обрабатываю его с помощью инструментов покрытия следующим образом:
llvm-profdata merge coverage.raw -o coverage.data
llvm-cov report -instr-profile=coverage.data <build output dir>/coverate_test
который затем вызывает указанную ошибку:
Failed to load coverage: No coverage data found
. Если я посмотрю на сгенерированные данные (например, вместо этого экспортировав текстовый вывод:
llvm-profdata merge coverage.raw -o coverage.data --text
, то я ясно вижу, что там есть все данные.
Теперь о странной части. Если я создаю точно такой же код вне AOSP (для той же версии Android), он будет работать должным образом, и отчет будет успешно создан. Единственное отличие, которое я могу найти, - это порядок записей в файле данных, см. Ниже.
Мое тестовое приложение - это просто класс
Foobar
двумя способами
add(int, int)
и
sub(int, int)
, и
add
называется
main()
. Я распечатываю результат, чтобы гарантировать, что вызов не будет оптимизирован.
Создано вне AOSP (Clang / LLVM 8):
main
# Func Hash:
24
# Num Counters:
1
# Counter Values:
1
_ZN6Foobar3addEii
# Func Hash:
24
# Num Counters:
1
# Counter Values:
1
Встроено в дерево AOSP (Clang / LLVM 10):
_ZN6Foobar3addEii
# Func Hash:
24
# Num Counters:
1
# Counter Values:
1
main
# Func Hash:
24
# Num Counters:
1
# Counter Values:
1
У меня есть:
- проверил, что компилятор, компоновщик и инструменты покрытия LLVM принадлежат одному и тому же набору (той же версии), поскольку я знаю, что данные покрытия могут быть несовместимы в разных версиях.
- просмотрел флаги компилятора и ссылок, чтобы увидеть, есть ли какие-либо, которые могут вызвать сбой инструментария покрытия. Но поскольку необработанный файл создается, я не знаю, как это могло быть.
- добавлен
--arch=aarch64
при формировании отчета. - просмотрел доступные варианты для
llvm-profdata
и, но не нашел ничего, что могло бы помочь.
Почему бы
llvm-cov
пожаловаться на недостающие данные о покрытии, когда они явно есть?
Обновление 1: я перенес набор инструментов, который использовался при встраивании внутри AOSP, в свой тестовый пример за пределами AOSP, и он по-прежнему работает, как ожидалось. Так что это не проблема инструментальной связки.