2010-09-24 10 views
25

MSDN dice questo circa la StackTrace proprietà della classe Exception:Come ottenere il numero di riga (s) in StackTrace di un'eccezione gettato in .NET di presentarsi

La proprietà StackTrace tiene una pila traccia , che è possibile utilizzare per determinare dove si è verificato l'errore nel codice. StackTrace elenca tutti i metodi chiamati che hanno preceduto l'eccezione e i numeri di riga nell'origine in cui sono state effettuate le chiamate.

Quindi so che questa informazione è disponibile. Come faccio a visualizzare i numeri di linea nella traccia dello stack? Il mio codice lancia un'eccezione in un pezzo di codice molto difficile e complesso che attraversa tonnellate di oggetti, quindi non voglio passare attraverso un periodo di miliardi di volte per vedere dove sta accadendo l'eccezione. La traccia dello stack dell'eccezione mostra solo le firme del metodo e nessun numero di riga.

+0

Se si esegue il debug del codice, è possibile indicare a Visual Studio di interrompere l'eccezione nel menu Debug. –

+2

Se conoscessi il numero di riga in cui veniva lanciata l'eccezione, potrei farlo. –

risposta

31

Per ottenere i numeri di riga nello StackTrace, è necessario disporre delle informazioni di debug corrette (file PDB) insieme alle DLL/exe. Per generare le informazioni di debug del, impostare l'opzione in Project Properties -> Build -> Advanced -> Debug Info:

alt text

Impostazione a full dovrebbe essere sufficiente (vedere la Advanced Build Settings Dialog Box docs per quello che le altre opzioni fanno). Le informazioni di debug (ad esempio i file PDB) vengono generate per le configurazioni di build di debug per impostazione predefinita, ma possono anche essere generate per le configurazioni di build di rilascio.

La creazione di PDB per le versioni di rilascio consente di spedire il codice senza PDB, ma di rilasciare i PDB accanto alle DLL se sono necessari numeri di riga (o anche per collegare un debugger remoto). Una cosa da notare è che in una build di rilascio, i numeri di riga potrebbero non essere del tutto corretti a causa delle ottimizzazioni fatte dal compilatore o dal compilatore JIT (questo è particolarmente vero se i numeri di riga mostrano 0).

+1

MSDN dice che non è possibile eseguire il debug remoto a meno che non si imposti/debug: pieno. Mi chiedo se questo significhi che se si imposta/debug: full è possibile allegare e eseguire il debug con l'origine anche senza il codice sorgente e/debug: pdbonly è sufficiente se si ha l'origine e non si preoccupa di occasionali dislocazioni del punto di esecuzione. – axk

+10

Questo non sembra funzionare, l'ho impostato su pieno, ma non ci sono numeri di linea nelle tracce dello stack. – msbg

+2

@msbg - 1). Sei sicuro di averlo impostato per le build di debug e RELEASE? 2). I numeri di riga verranno visualizzati solo per il codice ... come questo: my_code.temp.cmdBoom_Click (Oggetto mittente, EventArgs e) in TestApp \ test.aspx.cs: riga 1245 su System.Web.UI.WebControls.Button.OnClick (EventArgs e) su System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) su System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent (String eventArgument) ... anche hai deselezionato "Codice ottimizzato"? – mike

5

È necessario creare il progetto con i file pdb abilitati e assicurarsi di distribuire i file pdb con l'applicazione. È possibile verificare se i file pdb sono effettivamente creati per la configurazione facendo clic con il pulsante destro del mouse sull'assembly per cui sono necessari i file pdb, quindi dirigersi su Proprietà> Build> Avanzate e assicurarsi che in Output Debug Info sia impostato su pieno.

+1

I miei PDB ci sono, e tutto è impostato correttamente. Ancora un no. –

-10

Sembra aver trovato la soluzione. Su VS2010 almeno, con le informazioni di debug di output impostate su pieno, inoltre, non ho ottenuto i numeri di riga all'interno delle eccezioni. Il trucco sembra essere quello di attivare i numeri di riga all'interno dell'editor. (Strumenti -> Opzioni -> Editor di testo -> Tutte le lingue -> Generale -> Visualizza -> Numeri di riga)

Ora le eccezioni vengono visualizzate con i numeri di riga.

+1

ciao, non credo che abbia senso ... – Yuki

+2

Questo è il numero di riga di visualizzazione, non i numeri di linea su una traccia dello stack. – RemarkLima

0

Oltre agli altri ottimi suggerimenti, stavamo implementando su IIS. Disponevamo di un server di gestione temporanea e un server di produzione. Sono sembrati identici tranne che la messa in scena ci ha dato numeri di linea e la produzione no. Si è scoperto che c'era una DLL extra nella directory di produzione bin (si trattava di SqlServerSpatial.dll fwiw) e una volta che è stata spostata nella directory di sistema, i numeri di riga hanno iniziato ad apparire in produzione.

La lezione era di assicurarsi che la directory di produzione bin corrispondesse alla directory di sviluppo bin sotto ogni aspetto (eccetto per i file XML).

5

Se si dispone di un'applicazione Web o di un progetto di servizio Web utilizzando VS2012 o successivo, la modifica delle impostazioni di costruzione non funzionerà. Invece, si dovrebbe seguire i consigli in questo articolo:

Visual Studio 2012 Website Publish Not Copying .pdb files

In particolare, è necessario includere la seguente impostazione nel file

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml 

(s) per il progetto:

<PropertyGroup> 
    <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol> 
</PropertyGroup> 
+0

Se * si * utilizza MSBuild, ad es. con la configurazione * Package * e Web Deploy, puoi aggiungere lo stesso elemento '' al file * .csproj * del tuo progetto web. –

4

Si potrebbe provare quanto segue, dato che c'è un file pdb per il montaggio:

try 
{ 
    throw new Exception(); 
} 
catch (Exception ex) 
{ 
    // Get line number from the stack trace's top frame for the exception with source file information 
    int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber(); 
} 
Problemi correlati