2009-10-13 10 views
1

J'utilise Windbg pour diassembler le code managé (écrit en C#, application console) en utilisant la commande !U de Windbg de sos.dll. Je trouve en utilisant !U pour diassembler une fonction gérée, le code IL diassembled contient seulement des appels de fonction que j'ai faits, et pour des pièces restantes (code C# d'appel de non-fonction), par exemple a=a*2, et foreach les boucles en C#, seul code de langue d'assemblage natif est montré, est-ce le bon comportement attendu?diassemble géré code problème

Ma question est, je veux savoir si! U est capable de diassembler la DLL binaire de code managé en IL avec tout le code (en dehors du code d'appel de fonction)?

Merci à l'avance, George

Répondre

1

Je ne pense pas que WinDbg fonctionne au niveau IL. Vous devrez probablement utiliser ildasm pour obtenir un démontage IL.

+0

Je sais que l'ildasm ou le réflecteur pourrait le faire. Mais je débogue dans l'exécution ou le débogage dans le vidage sur incident, et j'ai besoin d'informations d'adresse de pile d'appel avec le code d'IL (que l'ildasm ou le réflecteur ne peut pas fournir). Si seul le code d'assemblage natif est affiché, il est difficile de déboguer, et c'est pourquoi je souhaite effectuer un diassemblage en code IL avec des informations d'adresse de pile d'appel. Des commentaires ou des solutions? – George2

9

Si vous souhaitez vider IL pendant le débogage, vous pouvez utiliser la commande !dumpil de SOS. Il prend un pointeur MethodDesc en entrée, donc vous devez l'obtenir en premier.

Une façon d'obtenir le pointeur MethodDesc utilise la commande !name2ee.

Ainsi, par exemple, si vous avez une méthode Foo dans le type Bar (dans l'assemblage ClassLibrary1) utiliser !name2ee comme celui-ci

0:000> !name2ee ClassLibrary1!ClassLibrary1.Bar.Foo 
Module: 001630bc (ClassLibrary1.dll) 
Token: 0x06000001 
MethodDesc: 00163450 <=== HERE 
Name: ClassLibrary1.Bar.Foo() 
JITTED Code Address: 007500f0 

Après cela, vous pouvez faire un !dumpil 00163450 pour vider l'IL pour la méthode Foo comme celui-ci

0:000> !dumpil 00163450 
ilAddr = 73532050 
IL_0000: ldstr "Foo" 
IL_0005: call System.Console::WriteLine 
+0

Je trouve! Dumpil ne peut pas sauvegarder les informations d'adresse natives? Par exemple, si je trouve mon code se bloque ou se casse à l'adresse natif 0x11111111, je veux voir quel code IL est en cours d'exécution? Pourrait! Dumpil faire ça? – George2

+2

Vous devez vous rappeler, que le code IL ne fonctionne pas réellement. Il est compilé en code natif qui est ensuite exécuté. Toutefois, si vous effectuez une sauvegarde d'un processus de plantage, le code JITTED et l'élément de données d'origine seront disponibles dans le vidage. Utilisez! U pour montrer CLR consciente désassemblée du code généré. Utilisez! Dumpil pour afficher IL. À partir de la trace de pile d'exception et du! Name2ee, vous devriez être capable de localiser à la fois le code JITTED et le code IL si nécessaire. –

+0

Mon problème est, en utilisant! U ne jamais IL code pour le code managé d'appel de non-fonction, pour le code managé d'appel de non-fonction (par exemple a = a + 2 ou boucle foreach), seul le code d'assembly natif est montré. Est-ce que ce comportement est attendu? – George2

Questions connexes