2009-04-06 8 views
1

Il existe de nombreux systèmes de consignation/traçage pour permettre à votre programme de transmettre des données, des chaînes ou des états en cours d'exécution. La plupart d'entre elles vous permettent d'imprimer des chaînes arbitraires que vous pouvez afficher en direct ou après l'exécution de votre programme. J'ai remarqué une annonce ici sur SO pour Smartinspect qui semble porter ce niveau à un niveau supérieur, donnant des traces de pile pour chaque journal, des options plus raffinées comme des graphiques de traçage et des valeurs de données qui changent au fil du temps, et beaucoup de polissage à la idée de base d'une liste simple de chaînes de texte en sortie.État de journalisation/traçage supérieur pour les applications C++

Depuis que j'utilise C++, Smartinspect ne fonctionne même pas pour moi. Un peu de googling trouve des tonnes de cadres de journalisation, mais rien qui semble faire plus que des vidages de texte. Leurs outils plus sophistiqués (similaires à Smartinspect?) En font-ils plus? Commercial ou open source est bien, et multiplateforme est un gros plus.

Répondre

4

Je sais que ce n'est pas la réponse que vous cherchez probablement, mais je suggérerais qu'un tel framework sera très difficile (sinon impossible) à trouver pour C++. Faire quelque chose comme le vidage de la pile ne peut pas être fait de manière portable comme dans un langage comme Java, qui non seulement partage un temps d'exécution commun sur toutes les plates-formes, mais fournit également de puissantes capacités d'introspection. Je ne programme pas en Java, mais je suppose qu'il peut fournir une pile-trace de la même manière que Python: la pile est probablement juste un autre objet dans l'exécution qui peut être inspecté et manipulé. D'autre part, le C++ n'a aucune de ces caractéristiques: il est censé être un langage proche du métal qui ajoute fondamentalement de l'orienté objet à C (je suis sûr que d'autres vont trouver des explications beaucoup plus éloquentes des bénéfices de C++ sur C mais c'est une autre discussion).

En bref, C++ n'est pas assez riche au niveau requis pour fournir le type de fonctionnalités dont vous avez besoin d'une manière générique. Il peut y avoir un code spécifique à la plate-forme qui pourrait obtenir une partie de cette information à des points définis pour vous là-bas, mais ce ne sera certainement pas conforme aux normes, C++ multiplate-forme. En ce qui concerne les graphiques, etc., cela ressemble beaucoup plus à un post-traitement, que vous devriez être capable de trouver quelque chose, ou plus probablement, vous pouvez peut-être afficher vos messages dans un format qui peut être interprété par certains de ces outils existants.

D'autres choses que vous pourriez regarder serait l'intégration avec syslogd, pour lequel encore, il peut y avoir des outils d'analyse plus riches pour (cela vous donnerait une capacité semblable à celle annoncée pour SmartInspect - c'est TCP/IP journalisation basée). NB: une grande partie de ce que j'ai dit ici à propos de C++ vient d'expériences précédentes qui essayaient de trouver des frameworks décents en C++ pour faire des trucs de type introspectif (comme les faux objets, etc.).

0

Si vous pouvez vous limiter à une certaine plate-forme, vous pouvez ajouter des traces de pile à vos journaux manuellement. Nous utilisons par exemple la fonctionnalité glibc pour obtenir des traces de pile sous Linux pour attacher des traces de pile dans notre classe d'exception. Il existe une fonctionnalité similaire disponible sur Windows, mais comme mentionné, ces infrastructures ne sont pas portables.

2

J'ai écrit un article sur le dumping de la pile en C/C++ avec Windows et Unix/Linux chez DDJ il y a quelques années. Peut-être qu'il vous aide:

Voir http://www.ddj.com/architect/185300443

+1

+1, en utilisant les fichiers de carte linker généré est une approche intéressante! –

Questions connexes