Упрощение GCOV на Android - PullRequest
       21

Упрощение GCOV на Android

0 голосов
/ 11 декабря 2018

Я пытаюсь получить отчет о покрытии кода на Android кода, который все на C ++ и использует цепочку инструментов компиляции CLANG.Из того, что я знаю, это, по сути, добавление --coverage -fprofile-arcs -ftest-coverage в флагах компилятора и статического связывания с libprofile_rt.Затем следует добавление __gcov_flush() во все пути выхода всех библиотек, которые связаны с основным приложением службы.

Это то, что я хотелулучшить.Я хочу избежать возни со всеми библиотеками.Есть ли способ, которым я могу вызвать __gcov_flush() всех связанных библиотек в детерминированном вопросе (скажем, при получении сигнала), чтобы я мог сбросить данные профиля?При выполнении

arm-linux-androideabi-gcc-nm -D $OUT/vendor/lib/liba.so |grep -i gcov

я получаю

00011bf8 T __gcov_flush
00011c40 T llvm_gcov_init

Я думаю, это означает, что вышеуказанные символы находятся в текстовом разделе библиотеки.

Я попробовал следующеекусок кода

#include <dlfcn.h>
#include <signal.h>
#include <link.h>

static int walk_callback(struct dl_phdr_info *info, size_t size, void *data)
{
    void (*func)();
    if (strlen(info->dlpi_name) == 0) return 0;
    ALOGE("lib is %s\n", info->dlpi_name);
    void *handle = dlopen(info->dlpi_name,  RTLD_NOW | RTLD_GLOBAL);
    if(handle) {
        *(void **)(&func) = dlsym(handle, "__gcov_flush");
        if (func) {
            ALOGE("Calling GCOV_FLUSH of %s\n",
                info->dlpi_name);
            func();
        }
    }
    return 0;
}

void sig_handler(int signum)
{
    ALOGE("Received signal %d\n", signum);
    dl_iterate_phdr(walk_callback, NULL);
}

int main(int argc, char** argv)int main(int argc, char** argv)
{
    argc,argv;    argc,argv;
    signal(SIGRTMIN + 3, sig_handler);
    ALOGE("Registered for %d", SIGRTMIN + 3);

При отправке сигнала процессу он выгружает все связанные библиотеки в журнале и может разрешить символ и вызвать gcov_flush, но это не похоже на генерациюGCDA файл для файлов в библиотеке.Это выполнимый подход к попытке?Если да, что я могу попытаться сгенерировать файлы GCDA?Если нет, есть ли другой возможный подход?

...