Quel est le meilleur moyen de découvrir pourquoi des threads sont créés dans mon application C ++ et ce qu’ils font?

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 tierces qui peuvent engendrer des threads. J’ai besoin de savoir pourquoi chaque thread est présent et combien d’espace il alloue.

Quel est le meilleur moyen de remonter au début de la création d’un thread pour que je puisse voir où il est généré?

Mise à jour: je devrais préciser que j’ai le code source dans toute l’application en dehors des dépendances de Microsoft. Cependant, beaucoup de threads ont des callstacks qui existent exclusivement à l’intérieur des bibliothèques fournies avec le système d’exploitation, telles que ntdll.dll et kernel32.dll.

Vous pouvez utiliser Windows Performance Toolkit pour afficher les événements ThreadCreate. Sur Vista, vous pouvez obtenir les stacks pour chaque thread créé afin de voir quel code crée le thread.

Recueillir la trace avec:

xperf -on base -stackwalk ThreadCreate 

Exécutez votre scénario, écrivez la trace avec:

 xperf -stop -d mylog.etl 

Affichez le fichier de trace avec:

 xperf mylog.etl 

Dans l’option de menu Trace, définissez votre chemin de symbole de manière appropriée et chargez les symboles. Vous pouvez utiliser Microsoft Symbol Server pour obtenir des symboles publics pour le système d’exploitation.

Sous “Process Lifetime”, cliquez avec le bouton droit de la souris et sélectionnez “Tableau récapitulatif des threads”. Vous pouvez append des colonnes pour la stack de création et la taille de la stack de l’utilisateur. Développez votre processus, vous pouvez voir tous les threads qui ont été créés, la stack qui a créé ce thread et la taille de la stack.

Process Explorer peut répertorier les threads ainsi que leur stack d’appels. Très utile si vous souhaitez inspecter un processus sans joindre un véritable débogueur.

pourquoi ne pas grep le code source et le chercher? (ça vous dira pourquoi)

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

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

Ce qui m’a aidé à plusieurs resockets, c’est de nommer les threads que je contrôle, voir MSDN . Cela ne vous aidera pas pour les threads générés et exécutés dans des bibliothèques tierces.