270 votes

Trace de pile affichage C++ exception

J’ai envie d’avoir un moyen de rendre la trace de la pile de l’utilisateur si une exception est levée. Quelle est la meilleure façon de le faire ? Faut-il des quantités énormes de code supplémentaire ?

Pour répondre aux questions :

Je voudrais qu’il soit portable si possible. Je veux des informations pour faire apparaître, si l’utilisateur peut copier la trace de la pile et envoyez-le à moi, si une erreur apparaît.

81voto

Andrew Grant Points 35305

Il dépend de la plate-forme.

Sur GCC c'est assez trivial, voir ce post pour plus de détails.

Sur MSVC ensuite, vous pouvez utiliser le StackWalker bibliothèque qui gère tous les sous-jacents des appels d'API nécessaires pour Windows.

Vous aurez à trouver le meilleur moyen d'intégrer cette fonctionnalité dans votre application, mais la quantité de code à écrire devrait être minime.

22voto

bobobobo Points 17477

UNIX : backtrace

Mac : backtrace

Windows : CaptureBackTrace

11voto

Kev Points 535

rlbond - vous l'avez probablement déjà remarqué, mais pour quelqu'un d'autre dans le futur...

Je viens d'utiliser l' StackWalker bibliothèque et après quelques tests, j'ai réalisé que si vous l'utilisez pour autre chose que de l'affichage des informations sur une demande d'arrêt d'exception, il vaut la peine de créer une instance unique de l' StackWalker objet. Pour une application multithread, vous pouvez créer une instance par thread à l'aide de TLS pour éviter les problèmes de synchronisation (n'ai pas essayé encore bien - être averti).

La raison pour cela est que 99%+ du temps pour générer une trace est consacré au chargement de tous les symboles. Ce pourcentage peut varier - les 99% est pour ma configuration, où j'ai sous-classe et de remplacer OnOutput() de tout enregistrer dans une mémoire tampon plutôt que d'afficher et puis il y mais le point est le même - ne les utilisez pas comme un objet, si vous allez utiliser beaucoup.

Mes timings étaient 42 ms pour créer une instance, obtenir la trace de la pile et de la jeter par rapport à environ 0,6 ms pour générer de la deuxième et les suivantes traces à l'aide du même objet.

Juste quelque chose à garder à l'esprit.

6voto

Nico Points 126

Autant que je sache libunwind est tout à fait portable et jusqu'à présent je n’ai pas trouvé quoi que ce soit plus facile à utiliser.

3voto

hplbsh Points 1812

Sous Windows, consultez BugTrap. Ses pas plus le lien original, mais son toujours disponible sur CodeProject.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X