2016-09-02 7 views
1

CONTEXTEgcc gprof/Gcov/autres - comment obtenir séquence d'appels de fonction/sorties + états des flux de contrôle

Nous avons testeurs pour notre produit GUI intégré et quand un testeur déclare « test a échoué », il est parfois difficile pour nous développeurs de reproduire le problème exact parce que nous n'avons pas la trace exacte de ce qui s'est passé.

Nous avons actuellement un cadre de journalisation mais les développeurs doivent entrer manuellement ces instructions de journalisation dans le code, ce qui est correct. . . sauf quand un bogue difficile à reproduire se produit et que nous n'avons pas d'instruction de journalisation à l'emplacement «correct», puis lorsque nous recréons, réexécutez le test avec les mêmes étapes, nous obtenons un résultat différent.

NUMÉRO

Nous voudrions une solution dans laquelle le compilateur produit du code d'instrumentation supplémentaire qui nous permet de voir la séquence exacte des événements, y compris, au minimum:

  1. fonction entrée/sortie (déjà fourni par -finstrument-functions)
  2. instruction de commande de contrôle entrée ie entrée if/else, quel état de cas Ment nous avons sauté à

Le journal ressemblera à ceci:

int main() entered 
if-line 5 entered 
else-line 10 entered 
void EventLoop() entered 
. . . 

Certains supplémentaires nice-to-haves sont

  1. Les valeurs des paramètres sur l'entrée de fonction ET sortie (pour les types passage par référence)
  2. Fonction valeur de retour

QUESTION

Existe-t-il des outils gcc ou même des outils payés qui peuvent faire cette instrumentation automatiquement?

+0

Il semble que vous ayez besoin d'un débogueur – EOF

+0

@EOF nous avons un débogueur Un débogueur n'enregistre pas le comple te trace d'appel. Mais même si c'est le cas, nous voulons que la capacité de trace sans débogueur – Adrian

+0

À moins que vous ayez beaucoup d'optimisations d'appel, une pile doit vous donner la séquence d'appels requise. Peut-être que vous pouvez demander aux testeurs de provoquer une coredump en envoyant un signal approprié? – EOF

Répondre

1

Vous pouvez utiliser gdb pour cela, et vous pouvez automatiser (j'ai un outil pour cela dans les œuvres, vous trouvez qu'il est here ou vous pouvez essayer d'utiliser gcov.

La mise en œuvre de gcov est Ainsi, il charge les dernières données gcov lorsque vous démarrez le programme, mais: vous pouvez vider et charger les données manuellement.Si vous appelez __gcov_flush, il va vider les données actuelles et réinitialiser l'état actuel.Mais si vous faites cela plusieurs fois il va toujours fusionner les données, donc vous devrez également renommer le fichier de données gcov puis

+0

Est-ce que le testeur doit interagir avec les commandes gdb? J'ai besoin que ceci soit totalement transparent pour le testeur, c'est-à-dire que le testeur doive seulement exécuter une commande 'get logs' après avoir fait des tests. – Adrian

+0

Oui et non. La chose est basée sur un plugin. Donc, vous écrivez un plugin qui est activé à un certain point d'arrêt et vous pouvez interagir de manière automatisée avec le gdb. Vous pouvez trouver ce qui est actuellement implémenté [ici] (https://github.com/mw-sc/mw.gdb-runner#frame) Je l'utilise principalement pour remplacer les syscalls sur un contrôleur non-eabi et pour obtenir les données de cette façon. Mais si vous voulez prolonger cela, je serais plus qu'heureux d'accepter les relations publiques et de vous aider. Écrivez-moi un mail. –