Я пытаюсь получить отчет о покрытии кода на 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?Если нет, есть ли другой возможный подход?