Question

Je voudrais imprimer mon message de débogage avec numéro de ligne dans l'application VB.net. Je l'ai fait comme ça,

Dim st As StackTrace
Dim sf As StackFramee
st = New StackTrace(New StackFrame(True))
sf = st.GetFrame(0)
Console.WriteLine.("Line " & sf.GetFileLineNumber())

Je veux mettre l'extrait à une classe, chaque appel que je méthode logmsg pour connecter mon message avec le numéro de ligne dans le code source. Mais j'ai trouvé si je mets l'extrait ci-dessus dans une classe, le numéro de ligne a toujours été même, qui est la ligne que je nouvelle « st ».

La fonction est exactement la même avec _ LINE macro en C ++. En fait, je suis programmeur de C.

Quoi qu'il en soit pour résoudre ce problème? merci.

Était-ce utile?

La solution

Le code que vous avez montré fonctionne exactement comme prévu. Il est l'impression du numéro de la ligne où vous avez capturé le cadre de la pile. Parce que vous l'avez défini dans une autre classe, il est l'impression du numéro de ligne du fichier qui contient cette classe.

La méthode GetFrame est important ici. Stack cadres sont numérotées à partir de 0, ce qui est le dernier cadre de pile poussé. Ainsi, en se référant à l'image 0, vous instruisez le moteur d'exécution d'imprimer le numéro de ligne du dernier cadre pile qui a été poussé. Quand une méthode appelle une autre, un nouveau cadre de pile est créé.

, vous avez besoin au lieu de changer votre méthode en deux façons importantes. Tout d'abord, vous devez obtenir le premier cadre qui a été poussé sur la pile. Deuxièmement, vous voulez probablement accepter un paramètre contenant des informations sur l'exception que vous répondez. Essayez de réécrire votre méthode de débogage à quelque chose de ressembler à ceci:

Public Sub PrintCurrentLine(ByVal ex As Exception)
    Dim st As StackTrace = New StackTrace(ex)
    Dim sf As StackFrame = st.GetFrame(st.FrameCount - 1)
    Console.WriteLine("Line " & sf.GetFileLineNumber())
End Sub

Rappelez-vous aussi que si vous utilisez le code avec des optimisations ont permis, des choses comme les numéros de ligne peuvent avoir changé. Vous devez toujours inclure le fichier PDB avec votre code, qui contient des informations de débogage qui est utilisé dans des situations comme celle-ci. Il mappe le dos de code optimisé pour votre source d'origine.

Autres conseils

Après avoir lu les quelques réponses que je suis tombé pour moi à la solution suivante comme équivalente à la macro C ++ LINE

(New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())

qui peut être utilisé par exemple comme:

Console.WriteLine(String.Format("Executed on line# {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber()))

Les assemblées compilé pas les numéros de ligne qui leur sont associés. Ce n'est pas l'information qui fait partie des ensembles.

Les informations sont conservées dans le fichier des symboles de débogage -. Le fichier pdb

De MSDN - StackTrace classe :

informations StackTrace sera plus informative avec des configurations de construction de débogage. Par défaut, debug inclure des symboles de débogage, alors que la libération construit ne le font pas. Les symboles de débogage contiennent la plupart du fichier, le nom de la méthode, le numéro de ligne et de l'information de colonne utilisée dans la construction d'objets StackFrame et StackTrace.

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