Aide Windbg - > Comment puis-je lire le code sur cette pile d'appel?
Question
J'ai effectué un tassement d'un service Windows que j'ai créé. L'exception est que mon code ne peut pas déplacer un fichier (pour une raison quelconque). Maintenant, dans mon code, il y a un certain nombre d'endroits où je déplace des fichiers dans le système de fichiers. Donc, en utilisant Windbg, j'essaie de voir le code où l'exception se produit.
voici mon! décharge de clrstack ..
0:016> !clrstack -p
OS Thread Id: 0xdf8 (16)
Child-SP RetAddr Call Site
0000000019edea70 0000064278a15e4f System.IO.__Error.WinIOError(Int32, System.String)
PARAMETERS:
errorCode = <no data>
maybeFullPath = <no data>
0000000019edead0 0000064280181ce5 System.IO.File.Move(System.String, System.String)
PARAMETERS:
sourceFileName = <no data>
destFileName = <no data>
0000000019edeb50 0000064280196532 MyClass.Foo.DoSomeStuffInHere(System.String)
PARAMETERS:
this = 0x0000000000c30aa8
filePathAndName = 0x0000000000d1aad0
maintenant, cela aide beaucoup ...
0:016> !do 0x0000000000d1aad0
Name: System.String
MethodTable: 00000642784365e8
EEClass: 000006427803e4f0
Size: 88(0x58) bytes
(C:\WINDOWS\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: C:\BlahBlahFolder\FooFolder\4469.jpg
Fields:
-snipped-
J'ai donc trouvé le fichier qui n'a pas pu être déplacé. kewl. Mais je veux juste voir le code dans cette méthode MyClass.Foo.DoSomeStuffInHere (System.String) qui appelle File.Move (..). Cette méthode a beaucoup de File.Move .. donc je pourrais mettre try / captures / debug / trace des informations .. mais j'espère être plus efficace en utilisant Windbg pour aider à trouver ce problème.
Avez-vous des idées?
La solution
Vous ne pouvez pas obtenir la ligne de code exacte, sauf si l'application a été déployée en mode débogage. Et si tel était le cas, je pense que ce serait leur montrer l’appel! Clrstack.
Autres conseils
C'est un problème difficile qui peut nécessiter de sortir de la zone de confort du débogage géré.
Ce que vous voulez faire est de mapper l'IL pour la fonction MyClass.Foo.DoSomeStuffInHere avec le désassemblage de cette fonction. Mon exemple ci-dessous est x86, mais x64 peut suivre les mêmes étapes.
Ceci est référencé très profondément dans le lien suivant. Débogage d'une fin de processus inattendue
Exemple de texte du livre blanc: Dans la pile gérée, Debugging.Unexpected.btnSTA_Click ... Examinez le code de l'événement Debugging.Unexpected.btnSTA_Click.
private void btnSTA_Click(object sender, System.EventArgs e)
{
DebuggingCOMLib.STAClass staobj = new DebuggingCOMLib.STAClass();
staobj.RaiseError(1,5);
Label1.Text += "STA Call Completed sucessfully";
}
Si le code source n'est pas disponible, vous pouvez examiner l'assemblage en fournissant le pointeur d'instruction pour le cadre de pile d'appels à la ! u commande . Le pointeur d’instruction peut être récupéré à partir de! Clrstack: output.
0096f970 03a00e06 [DEFAULT] [hasThis] Void
Debugging.Unexpected.btnSTA_Click(Object,Class System.EventArgs)
Pour désassembler cette fonction, entrez ! u 03a00e06 .
0:010> !u 03a00e06
Normal JIT generated code
[DEFAULT] [hasThis] Void Debugging.Unexpected.btnSTA_Click(Object,Class
System.EventArgs)
Begin 03a00de0, size 54
<snip>
03a00e18 8b15a89c1702 mov edx,[02179ca8] ("STA Call Completed
sucessfully")
03a00e1e e83d3590ff call 03304360 (System.String.Concat)
<snip>
03a00e2f 5e pop esi
03a00e30 5f pop edi
03a00e31 c20400 ret 0x4
Ok, maintenant quoi?
Analysez votre propre! U sortie pour une ligne comme
call 03304360 (System.IO.File.Move)
Vous pouvez également exécuter! ip2md 03a00e06 pour obtenir le MethodDesc, puis exécuter ! dumpil pour examiner le code IL si cela est plus facile.
Vous pouvez compter le nombre d'appels vers System.IO.File.Move dans la ! u sortie , puis compter à rebours le même nombre dans l'IL. Ensuite, vous pouvez utiliser .NET Reflector pour désassembler la méthode, mapper le C # sur IL et comparer le résultat.
Beaucoup d'étapes, mais vous obtiendrez le même résultat: -)
Merci, Aaron