Visualizza il numero di righe in Stack Trace per .NET assembly in modalità Release


139

Esiste un modo per visualizzare le linee nella traccia dello stack per la build / distribuzione dell'assembly .NET in modalità Release?

AGGIORNARE:

La mia applicazione è divisa in tre progetti di libreria di classi e un progetto di "sito Web" ASP.NET. L'errore che sto cercando di rintracciare è in uno dei tre progetti di biblioteca di classe. Ho distribuito solo il file pdb per il progetto della libreria di classi che genera l'errore "Riferimento oggetto non impostato su un'istanza di un oggetto".

I numeri di riga non vengono ancora visualizzati nella traccia dello stack. Devo distribuire i file pdb per tutti i progetti per ottenere i numeri di riga nella traccia dello stack?

Soluzione di lavoro

La distribuzione del file pdb per ogni applicazione ha risolto il problema relativo al numero di riga.

Risposte:


147
  • Passare alla finestra Proprietà per il progetto in cui si desidera visualizzare i numeri delle righe di traccia dello stack.
  • Fai clic sulla "scheda verticale" di Build.
  • Seleziona la configurazione "Rilascia". Controllare il parametro della costante DEBUG.
  • Deseleziona il parametro "Ottimizza codice" per evitare il problema di traccia occasionale con codice incorporato (questo passaggio non è essenziale).
  • Premi il pulsante Avanzate ... e scegli Output -> Informazioni debug -> solo pdb.
  • Distribuire il file .pdb generato con l'assembly.

Implementato con il commento qui sotto:

  • Un'altra cosa da verificare è nella sezione "Pacchetto / Pubblica Web" che anche la casella di controllo "Escludi simboli di debug generati" è deselezionata

2
Devo distribuire il file pdb insieme all'assembly?
Michael Kniskern,

7
Sì. Ecco dove si trovano i simboli di debug e i numeri di riga.
John Saunders,

5
Probabilmente non vorrai esporre queste informazioni se non è necessario. Usalo per eseguire il debug di un problema client, sì. Ma non sempre vuoi farlo perché le informazioni di debug possono fornire dati sensibili ed essere un vettore di attacco. A seconda della tua app.
i_am_jorf

6
@Carlo: le informazioni di debug funzionano anche con il codice di rilascio (ottimizzato), tuttavia il debug è alquanto limitato ( stackoverflow.com/questions/113866 ). Tuttavia i callstack sono abbastanza affidabili anche nel codice ottimizzato, ad eccezione delle funzioni incorporate e delle situazioni occasionali in cui può mancare la chiamata di coda perché la sequenza di chiamata xxx / ret è stata sostituita con jmp xxx.
Suma

12
Un'altra cosa da verificare è nella sezione "Pacchetto / Pubblica Web" che anche la casella di controllo "Escludi simboli di debug generati" è deselezionata
Gaz,

17

In VS2012 è necessario deselezionare "Escludi simboli di debug generati" nella sezione Pacchetto / Pubblica Web delle proprietà.


o se si tratta di un'app desktop, assicurarsi che il file PDB sia distribuito
CAD bloke,


9

In passato ho riscontrato problemi in cui sento la necessità di distribuire file PDB con una versione di rilascio per rintracciare un errore. Il motivo è, come hai detto, che l'eccezione si è verificata in un metodo molto ampio e non sono riuscito a individuare con precisione dove stava accadendo.

Ciò potrebbe indicare che il metodo deve essere sottoposto a refactoring in metodi più piccoli e più granulari. Non una risposta adatta a tutte le dimensioni, ma questo approccio mi è servito bene a breve termine (ho spesso trovato il bug durante il refactoring) e nel lungo periodo.

Solo un pensiero.


Questo. E man mano che procedi, prova a catturare in luoghi più abbozzati con una grana più fine. E aumentare le protezioni all'inizio di queste funzioni se si devono fare ipotesi.
Gerard ONeill,

Spesso detto e così vero, tuttavia, c'è un'eredità, ci sono programmatori che scrivono nuovi metodi di grandi dimensioni, e talvolta un metodo di grandi dimensioni è in realtà la cosa migliore da fare (dividerlo è confuso o YAGNI). Inoltre, anche per un metodo a 5 righe - restringi la ricerca di 5 volte - quindi i PDB sono un male necessario nella produzione a meno che non ti prenda il
disturbo

3

Includi simboli di debug nel tuo pacchetto di compilazione / distribuzione.


0

In VS 2008 Express l'ho trovato in Proprietà progetto -> Compila -> Opzioni di compilazione avanzate.


1
Cosa hai trovato? Puoi pubblicare un commento se non vuoi pubblicare una risposta completa.
jumxozizi,

-4

Funziona sempre. Devi solo eseguire la sottostringa del messaggio di traccia dello stack. Facile! Inoltre, in vb.net devi fare "Mostra tutti i file" e includere il pdb.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

Versione C #:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.