Résumé exécutif : Je veux utiliser GDB pour extraire les compteurs d'exécution de la couverture stockés en mémoire dans ma cible embarquée, et les utiliser pour créer des fichiers .gcda
(pour alimenter gcov/lcov).
Configuration :
- Je peux compiler en cross avec succès mon binaire, ciblant ma cible embarquée spécifique - puis l'exécuter sous QEMU.
- Je peux également utiliser le support GDB de QEMU pour déboguer le binaire (c'est-à-dire utiliser
tar extended-remote localhost:...
pour se connecter au serveur GDB QEMU en cours d'exécution, et contrôler entièrement l'exécution de mon binaire).
Couverture : Maintenant, pour effectuer une analyse de couverture "sur cible", je compile en cross avec -fprofile-arcs -ftest-coverage
. GCC émet alors des compteurs sur 64 bits pour suivre les comptages d'exécution de blocs de code spécifiques.
En cas d'exécution normale (c'est-à-dire sur l'hôte, non compilé en cross), lorsque l'application se termine, __gcov_exit
est appelé - et rassemble tous ces comptages d'exécution dans des fichiers .gcda
(que gcov utilise ensuite pour rapporter les détails de la couverture).
Cependant, dans ma cible embarquée, il n'y a pas vraiment de système de fichiers - et libgcov contient essentiellement des ébauches vides pour toutes les fonctions __gcov_...
.
Solution de contournement via QEMU/GDB : Pour résoudre cela, et le faire de manière indépendante de la version de GCC, je pourrais lister les symboles liés à la couverture dans mon binaire via MYPLATFORM-readelf
, et extraire ceux pertinents avec grep
(par exemple __gcov0.Task1_EntryPoint
, __gcov0.worker
, etc) :
$ MYPLATFORM-readelf -s binaire | grep __gcov
...
46: 40021498 48 OBJECT LOCAL DEFAULT 4 __gcov0.Task1_EntryPoint
...
Je pourrais ensuite utiliser les décalages/tailles rapportés pour créer automatiquement un script GDB - un script qui extrait les données des compteurs via de simples vidages de mémoire (à partir du décalage, vider longueur octets vers un fichier local).
Ce que je ne sais pas (et n'ai pas réussi à trouver d'informations/outil pertinent), c'est comment convertir les paires résultantes de (décalage mémoire, données mémoire) en fichiers .gcda
. Si un tel outil/script existe, j'aurais un moyen portable (indépendant de la plateforme) pour effectuer une couverture sur n'importe quelle plateforme prise en charge par QEMU.
Existe-t-il un tel outil/script ?
Toute suggestion/indication serait grandement appréciée.
MISE À JOUR : J'ai résolu cela moi-même, comme vous pouvez le lire ci-dessous - et j'ai écrit un article de blog à ce sujet.