2011-01-07 11 views
12

Tal vez hacer la pregunta revela mi falta de conocimiento sobre el proceso, pero una vez más, ¡no hay una mejor razón para preguntar!¿Por qué no objetar excepciones de error de referencia en .net dime qué objeto era nulo?

Seguir estos pasos puede ser frustrante porque los rastros de pila pueden ayudarme a saber por dónde empezar a buscar pero no cuál fue el objeto nulo.

¿Qué está pasando debajo del capó aquí? ¿Es porque los nombres de las variables no están agrupados en el ejecutable?

+0

Sí, es realmente irritante. También me gustaría saber –

+0

Sabes, nunca he pensado en eso, ¡buena pregunta! –

Respuesta

5

código .NET construida con optimizaciones completas y sin información de depuración: los nombres de las variables locales se han ido, algunas variables locales puede haber sido eliminado por completo.

código .NET construida con optimizaciones completos + PDB (o depuración completa): la mayoría de los nombres de variables locales conservadas, algunas variables locales puede haber sido eliminado

No hay optimizaciones + ninguna información de depuración: nombres de las variables locales se han ido.

Y luego tenemos que considerar que lo que sea que esté tratando puede no estar en una variable local en absoluto - podría haber sido el resultado de una llamada de función anterior, en la que está encadenando una nueva llamada de función.

0

No hay "identificador de objeto". No hay forma de que .NET pueda decir "el objeto con el identificador xxxx es nulo".

Aprenderá a no cometer estos errores, no se preocupe. Solo divide tus expresiones en partes más pequeñas, y encontrarás los objetos que olvidaste inicializar. Aprenderá a inicializarlos en ese escenario, y después de un tiempo, ese caso no volverá a suceder.

+0

"Aprenderá a no cometer estos errores, no se preocupe". ¡Hahahahahahaha! Todavía no. ¿Alguien más ha dejado de cometer estos errores? – jrsconfitto

1

Básicamente usted respondió su propia pregunta. Cuando se compila el código, se transforma en un lenguaje intermedio (IL). IL no tiene nombres de variables de la forma en que lo hace su código, los argumentos a un método que se llama son empujados a una pila antes de que se llame al método y los argumentos de los métodos de corrientes y las variables locales son referidos por la posición allí. Creo que esto se debe a que esta estructura ayuda al compilador JIT a generar código.

El archivo de símbolos pdb almacena una asignación entre el IL generado y su código. Se usa para indicarle a qué línea del código hace referencia cada llamada de método en la pila de llamadas. Posiblemente, la información almacenada aquí no es lo suficientemente detallada como para decir qué variable es nula, o posiblemente se consideró demasiado cara en términos de rendimiento para poder hacer esto. En cualquier caso, si ha permitido que el compilador optimice la IL generada, es posible que ya no haya una correlación uno a uno entre las variables en la IL y las variables en su código.

Espero que ayude, Rob

Cuestiones relacionadas