Question

Autre que la lecture du fichier GetFileName () et la lecture dans la ligne GetFileLineNumber () d'un stackframe de

new StackTrace(exception).GetFrame(x)

existe-t-il un moyen d'obtenir la ligne de code réelle (sous forme de chaîne) ayant provoqué une exception?

Merci

Était-ce utile?

La solution

Le débogage post-traitement est difficile, mais pas impossible. Il existe des outils que vous pouvez utiliser ( ici. et ici , par exemple), ainsi que techniques .

Autres conseils

Je ne pense pas. Le code est compilé, donc il n'est plus disponible. Cependant, si vous possédez également le code source, il se peut que vous disposiez de quelques solutions de contournement.

Non, c'est votre seule option à ma connaissance. Pour obtenir la ligne de code d'origine qui a provoqué l'exception, il est nécessaire de disposer de la source. Que le StackFrame vous permet déjà d'obtenir le numéro de ligne (via les symboles de débogage - le fichier PDB dans la plupart des cas), le rend assez simple, je dirais.

La méthode que vous avez suggérée pose-t-elle un problème particulier?

Il n’existe aucun moyen fiable de procéder car les informations de ligne ne sont pas stockées dans des fichiers DLL. Les informations qui mappent des blocs de IL dans les lignes de code source sont stockées dans le fichier PDB. Vous devez accéder à l'APB pour obtenir les informations de ligne d'une exception.

Il existe suffisamment d'informations sur la classe StackFrame pour obtenir la classe ISymUnmanagedMethod appropriée si le PDB est disponible. Vous avez principalement besoin du jeton de méthode et du décalage actuel dans la méthode. Cela nécessite que vous compreniez la structure interne de l'APB et je ne suis pas sûr qu'elle soit documentée nulle part.

API PDB: http://msdn.microsoft.com/en- us / library / ms233503.aspx

Il serait compilé, donc au moment de l'exécution, vous ne disposez que de l'IL. Au mieux, vous pouvez obtenir l'IL et le décompiler en C #, comme le fait le réflecteur.

Vous pouvez obtenir une ligne à l'aide d'un bloc try catch :

catch(Exception exception) {
    //exception.StackTrace at the first line has the line you are looking for
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top