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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top