2012-05-25 1 views
3

Je travaille sur les commandes SOS et leur sortie, mais j'ai remarqué qu'il n'y a pas moyen d'obtenir tous les types qui sont actuellement utilisés en quelque sorte. Le meilleur moyen à ce jour est !dumpheap -stat, mais il ne répertorie que les types pour lesquels il existe des instances. Toutefois, lorsqu'un ValueType n'est jamais encadré, ce type n'apparaîtra pas sur !dumpheap -stat. (Ce qui n'est pas surprenant, car ils ne sont pas alloués sur le tas.)Manière efficace d'obtenir le nom/MT de ValueTypes non listés dans! Dumpheap -stat

Donc, ma question est: Existe-t-il des moyens efficaces pour déterminer quels ValueTypes supplémentaires existent actuellement? Je veux dire, je pourrais les charger sur demande en inspectant des objets de tas individuels (quelque chose comme !dumpvc <mt> <address> basé sur !do <address> sortie), mais pour les statistiques affichées, il serait agréable de trouver les types par des moyens plus simples que de regarder (instances/définitions de classe de) toutes les classes connues pour déterminer si elles utilisent des ValueTypes supplémentaires.

+0

Question étrange. Pourquoi savoir qu'un programme utilise System.Int32 serait utile? ! dumpmodule -mt liste tous les types dans un module, y compris les types de valeur. –

+0

Je ne suis pas vraiment après Int32 et les types de base similaires. Les types composites avec plus d'un membre sont les parties intéressantes, par exemple 'System.Drawing.Color', qui consiste en une chaîne, un long et deux courts métrages. – Wormbo

Répondre

0

Il ne semble pas y avoir de moyen efficace de le faire. En d'autres termes, j'ai fini par vérifier chaque type !DumpHeap -stat retourné pour savoir s'il s'agit d'un tableau struct ou contient des champs struct. Dans les deux cas, je dois vérifier de manière récursive si le nouveau type de structure contient des champs struct. Dans ce cas, la récursivité est requise, sauf si j'ai déjà vu le type struct.

!DumpModule -mt n'est pas une option, btw. Par exemple, je vois System.Collections.Generic.List`1, mais rien qui représenterait par exemple. la classe List.

Questions connexes