Comment puis-je ajouter une Trace() à chaque appel de méthode en C#?
Je vais avoir un moment difficile la poursuite d'un verrou de question, donc je tiens à vous connecter à chaque appel de la méthode d'entrée et de sortie. Je l'ai fait avant avec le C++ sans avoir à ajouter du code pour chaque méthode. Est-ce possible avec C#?
- Étant donné que vous savez ce que vous êtes et de verrouillage à peu près où il est, comment au sujet de l'affichage du code...
- Être averti, ce sera la plus susceptible de modifier le calendrier de votre application de manière significative assez que votre problème de verrouillage disparaît.
- L'évolution de l'environnement de votre code à défaut par l'ajout automatique d'appels de fonctions supplémentaires peuvent modifier l'état au moment où la mort de verrouillage ne se produit plus. Poster du code pourrait être préférable d'essayer de résoudre le problème.
- Très vrai - même l'accrochage d'un débogueur à l'application en cours d'exécution empêche le problème de se produire. Je n'ai pas fini d'aller dans cette voie, j'ai trouvé la cause à l'aide de WinDbg et des dizaines de stacktrace décharges.
- Juste pour mémoire, je n'ai pas fini d'aller de cette façon. J'ai fini par résoudre le problème à l'aide de WinDbg et des dizaines de stacktrace décharges.
- Je suis confronté au même problème mais avec le C++ et je ne veux pas ajouter de code de chaque méthode. Pourriez-vous svp m'indiquer la bonne direction. Je ne suis pas d'essayer de déboguer l'application. Je veux utiliser le présent appel d'entrée/sortie de journal pour une autre analyse.
Vous devez vous connecter pour publier un commentaire.
Probablement votre meilleur pari serait d'utiliser un AOP (aspect oriented programming) cadre pour appeler automatiquement le traçage de code avant et après l'exécution de la méthode. Un choix populaire pour les AOP et .NET est PostSharp.
Un profileur est idéal pour regarder votre code en cours d'exécution pendant le développement, mais si vous êtes à la recherche pour la capacité à faire des traces personnalisées dans la production, puis, comme Denis G. dit, PostSharp est l'outil parfait: vous n'avez pas à changer tout votre code et vous pouvez facilement activer/la désactiver.
Il est également facile à mettre en place en quelques minutes et Gaël Fraiteur, le créateur de PostSharp a même des vidéos qui vous montre comment il est facile d'ajouter le traçage d'une application existante.
Vous trouverez des exemples et des tutoriels dans le section documentation.
Si votre objectif principal est de la fonction log de points d'entrée/sortie et d'occasion, de l'information entre les deux, j'ai eu de bons résultats avec une Jetables la journalisation de l'objet où le constructeur traces d'entrée de la fonction, et Dispose() retrace la sortie. Cela permet d'appeler le code de simplement envelopper chaque méthode de code à l'intérieur d'un seul à l'aide de déclaration. Les méthodes sont également fournis pour arbitraire journaux entre les deux. Voici une complète C# ETW suivi des événements de classe avec une fonction d'entrée/sortie wrapper:
Code qui utilise il ressemblera à quelque chose comme ceci:
Utilisation ANTS Profiler de Porte Rouge serait votre meilleur pari. À défaut, regarder dans les intercepteurs dans Le Château De Windsor. Qui n'a supposer que vous êtes le chargement de vos types via Cio bien.
Réflexion est une autre façon, vous pouvez utiliser le Système.De la réflexion.Émettre méthodes "d'écrire" le code dans la mémoire. Ce code pourrait remplacer votre méthode de code, et de l'exécuter, mais avec enregistrement approprié. Bonne chance sur ce coup, mais... plus Facile serait d'utiliser un Aspect de la Programmation Orientée cadre comme Aspect#.
Il pourrait être en attente pour le verrouillage de problème à prendre en main, de faire un vidage de la mémoire et de l'analyse de la pile d'appel sur les différents threads. Vous pouvez utiliser DebugDiag ou le adplus de script (se bloquer en mode, dans ce cas) qui vient avec Les Outils de débogage pour Windows.
Tess Ferrandez a aussi un excellent laboratoire de la série sur l'apprentissage de débogage diverses questions à l'aide .NET les vidages de mémoire. Je le recommande fortement.
Comment savez-vous qu'il se passe? Si c'est une application multithread, je vous conseille le test de la condition et de l'appel Système.Diagnostics.Débogueur.Pause() lors de l'exécution lorsqu'il est détecté. Ensuite, il vous suffit d'ouvrir la fenêtre Threads et pas à travers les piles d'appels sur chaque fil.