2011-01-07 13 views
12

Forse fare la domanda tradisce la mia mancanza di conoscenza del processo, ma poi di nuovo, non c'è motivo migliore per chiedere!Perché le eccezioni degli errori di riferimento degli oggetti in .net non mi dicono quale oggetto era nullo?

Il rilevamento di questi valori in basso può essere frustrante perché le tracce di stack possono aiutarmi a capire dove iniziare a cercare, ma non quale oggetto era nullo.

Cosa sta succedendo sotto il cofano qui? È perché i nomi delle variabili non sono raggruppati nell'eseguibile?

+0

Sì, è davvero irritante. Mi piacerebbe anche sapere. –

+0

Sai, non ci avevo mai pensato - bella domanda! –

risposta

5

NET costruito con le ottimizzazioni piena e non informazioni di debug: i vostri nomi delle variabili locali se ne sono andati, alcune variabili locali potrebbe essere stato eliminato del tutto.

NET costruito con il massimo dei ottimizzazioni + PDB (o piena di debug): la maggior parte dei nomi delle variabili locali conservate, alcune variabili locali potrebbe essere stato eliminato

Nessun ottimizzazioni + senza informazioni di debug: i nomi delle variabili locali sono andati.

E poi dobbiamo considerare che qualsiasi cosa tu abbia a che fare potrebbe non essere affatto in una variabile locale - potrebbe essere il risultato di una precedente chiamata di funzione, sulla quale stai concatenando una nuova chiamata di funzione.

0

Non esiste un "identificativo dell'oggetto". Non c'è modo che .NET possa dire "l'oggetto con identificatore xxxx è nullo".

Imparerai come non commettere questi errori, non ti preoccupare. Basta abbattere le tue espressioni in parti più piccole e troverai quali oggetti hai dimenticato di inizializzare. Imparerai a inizializzarli in quello scenario, e dopo un po ', quel caso non accadrà più.

+0

"Imparerai come non commettere questi errori, non preoccuparti." Hahahahahahaha! Non ho ancora Qualcun altro ha smesso di fare questi errori? – jrsconfitto

1

Fondamentalmente hai risposto alla tua domanda. Quando viene compilato il codice, viene trasformato in linguaggio intermedio (IL). L'IL non ha nomi di variabili come fa il tuo codice, gli argomenti di un metodo che vengono chiamati sono messi su uno stack prima che il metodo venga chiamato e gli argomenti dei metodi correnti e le variabili locali sono riferiti da lì posizione. Credo che questo sia dovuto al fatto che questa struttura aiuta il compilatore JIT a generare codice.

Il file di simboli pdb memorizza una mappatura tra l'IL generato e il codice. È usato per dirti quale linea nel tuo codice si riferisce a ogni chiamata di metodo nello stack di chiamate. Forse le informazioni qui archiviate non sono abbastanza dettagliate per dire quale variabile è nulla, o forse è stata considerata troppo costosa in termini di perf per essere in grado di farlo. In ogni caso, se hai permesso al compilatore di ottimizzare l'IL generato, potrebbe non esserci più una mappatura uno a uno tra le variabili nell'IL e le variabili nel tuo codice.

Speranza che aiuta, Rob