2009-09-29 6 views
2

Je fais un audit d'une application C++ fonctionnant sous Windows, compilée avec une DLL de débogage multithread. Il a beaucoup de dépendances de tiers qui peuvent générer des threads. J'ai besoin de savoir pourquoi chaque thread est là et combien d'espace de pile il alloue.Quelle est la meilleure façon de découvrir pourquoi les threads sont créés dans mon application C++ et ce qu'ils font?

Quel est un bon moyen de retracer au début de la création d'un thread afin que je puisse voir où il est engendré?

Mise à jour: Je dois préciser que j'ai le code source pour l'application entière en dehors des dépendances Microsoft. Cependant, beaucoup de threads ont des callstacks qui existent exclusivement dans les bibliothèques livrées avec le système d'exploitation, telles que ntdll.dll et kernel32.dll. Pourquoi ne pas grep le code source et le chercher?

Répondre

0

(Cela vous dira pourquoi)

5

Vous pouvez utiliser Windows Performance Toolkit pour afficher les événements ThreadCreate. Sur Vista en haut, vous pouvez obtenir les piles pour chaque thread créer, de sorte que vous pouvez voir quel code crée le fil.

Ramassez la trace avec:

xperf -on base -stackwalk ThreadCreate 

Lancez votre scénario, l'écrire la trace avec:

xperf -stop -d mylog.etl 

Voir le fichier de trace avec:

xperf mylog.etl 

Dans la Trace option de menu, définissez correctement votre chemin de symbole et chargez les symboles. Vous pouvez utiliser le Microsoft Symbol Server pour obtenir des symboles publics pour le système d'exploitation.

Sous "Process Lifetimes", cliquez avec le bouton droit de la souris et sélectionnez "Thread Summary Table". Vous pouvez ajouter des colonnes pour la pile de création et la taille de la pile utilisateur. Développez votre processus, vous pouvez voir tous les threads qui ont été créés, la pile qui a créé ce thread et la taille de la pile.

0

Avez-vous accès au code source? Si c'est le cas, créez une fonction qui affiche l'identifiant du thread et la mémoire allouée et appelez-le pour tous les threads.

4

Process Explorer peut lister les threads ainsi que leur pile d'appels. Très utile si vous voulez inspecter un processus sans attacher un vrai débogueur.

0

Je n'ai pas encore rencontré un moyen de revenir à l'appel CreateThread, je ne pense pas que cette information est disponible pour un thread.

Ce qui m'a aidé à quelques reprises est de nommer les threads que je contrôle, voir MSDN. Je ne vais pas vous aider pour les threads engendrés et fonctionnant dans des bibliothèques tierces, cependant.

Questions connexes