Покрытие собственного кода 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, и он по-прежнему работает, как ожидалось. Так что это не проблема инструментальной связки.

0 ответов

Другие вопросы по тегам