Domanda

Vorrei stampare il mio messaggio di debug con il numero di riga in applicazione VB.net. Ho fatto come questo,

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

Voglio mettere il frammento a una classe, ogni chiamata di metodo logmsg ho per accedere il mio messaggio con il numero di riga nel codice sorgente. Ma ho trovato, se ho messo il frammento di codice in una classe, il numero della linea era sempre lo stesso, questa è la linea che ho nuovo 'st'.

La funzione è esattamente lo stesso con _ LINE macro in C ++. In realtà io sono C ++ programmatore.

In ogni modo per risolvere questo problema? grazie.

È stato utile?

Soluzione

Il codice che hai mostrato funziona esattamente come previsto. E 'la stampa il numero della riga in cui hai catturato lo stack frame. Perché tu hai definito in una classe diversa, è la stampa del numero di riga del file che contiene quella classe.

Il metodo GetFrame è importante qui. stack frame sono numerate a partire da 0, che è il ultima stack frame spinto. Quindi, facendo riferimento alla cornice 0, si comunica al runtime per stampare il numero di riga del ultima stack frame che è stato spinto. Quando un metodo chiama un altro, si crea un nuovo stack frame.

Al contrario, è necessario modificare il metodo in un paio di modi importanti. In primo luogo, è necessario ottenere il prima telaio che è stato inserito nello stack. E in secondo luogo, probabilmente si desidera accettare un parametro che contiene informazioni sul l'eccezione che si sta rispondendo a. Provare a riscrivere il metodo di debug di simile a questa:

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

Ricorda inoltre che se si sta eseguendo il codice con le ottimizzazioni attivate, le cose come numeri di riga possono essere cambiati. È sempre necessario includere il file PDB con il codice, che contiene le informazioni di debug che viene utilizzato in situazioni come questa. Esso mappa la parte posteriore codice ottimizzato alla sorgente originale.

Altri suggerimenti

Dopo aver letto le diverse risposte sono venuto per me, per la seguente soluzione come equivalente alla macro C ++ LINE

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

, che può essere utilizzato ad esempio come:

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

Gli assembly compilati non avrà numeri di riga ad essi associati. Questa non è informazione che fa parte dei gruppi.

Le informazioni sono conservate in file di simboli di debug -. Il file pdb

Da MSDN - StackTrace classe :

Informazioni StackTrace sarà più informativo con le configurazioni di build di debug. Per impostazione predefinita, Debug costruisce includere i simboli di debug, mentre il rilascio costruisce Non. I simboli di debug contengono la maggior parte del file, nome del metodo, il numero di riga, e le informazioni colonna utilizzata nella costruzione StackFrame e StackTrace oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top