Domanda

Oltre a leggere il file GetFileName () e leggere alla riga GetFileLineNumber () di uno stackframe da

new StackTrace(exception).GetFrame(x)

c'è un modo per ottenere l'effettiva riga di codice (come una stringa) che ha causato un'eccezione?

Grazie

È stato utile?

Soluzione

Il debug post moretem è difficile, ma non impossibile. Ci sono strumenti che puoi usare ( qui e qui , ad esempio), nonché tecniche .

Altri suggerimenti

Non credo. Il codice è compilato, quindi non è più disponibile. Tuttavia, se anche hai il codice sorgente disponibile, potrebbero esserci alcune soluzioni alternative.

No, questa è l'unica opzione per quanto ne so. Per ottenere la riga di codice originale che ha causato l'eccezione, è necessario disporre della fonte disponibile. Che il StackFrame ti consente già di ottenere il numero di riga (tramite i simboli di debug - il file PDB nella maggior parte dei casi), lo rende abbastanza semplice, direi.

C'è qualche problema particolare con il metodo che hai suggerito?

Non esiste un modo affidabile per farlo perché le informazioni sulla linea non sono memorizzate nei file DLL. Le informazioni che mappano i blocchi di IL in righe di codice sorgente sono memorizzate nel file PDB. Dovresti accedere al PDB per ottenere le informazioni sulla linea per un'eccezione.

Esistono informazioni sufficienti sulla classe StackFrame per ottenere la classe ISymUnmanagedMethod appropriata se il PDB è disponibile. Principalmente hai solo bisogno del token del metodo e dell'offset corrente nel metodo. Ciò richiede di comprendere la struttura interna del PPB e non sono sicuro che sia documentato ovunque.

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

Sarebbe compilato, quindi in fase di esecuzione avresti solo IL. Nel migliore dei casi, potresti ottenere l'IL e decompilarlo in C #, proprio come fa Reflector.

Puoi ottenere la linea usando un blocco try catch :

catch(Exception exception) {
    //exception.StackTrace at the first line has the line you are looking for
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top