2010-01-13 13 views
11

Primero déjeme decir que vengo de un fondo en Flash/AS3, que me doy cuenta de que no es tan estricto sobre la mayoría de las cosas como iPhone/Objective-C.¿Por qué es EXC_BAD_ACCESS tan inútil?

Sospecho que mi pregunta realmente se aplica también a AS3, pero permítanme preguntarlo sobre Obj-c. ¿Por qué el error EXC_BAD_ACCESS, y otros similares, son tan inútiles? Me doy cuenta de que normalmente significa una mala administración de la memoria en algún lugar, pero ¿por qué no puede contarte más sobre el problema? Por ejemplo, ¿por qué no dice "EXC_BAD_ACCESS, trataste de pasar un puntero como AndSuch en la línea 123, sin embargo eres un idiota, porque lo lanzaste en la línea 69 por lo que ya no está disponible"?

Me doy cuenta de que puedo usar el depurador para obtener más pistas sobre dónde ocurrió mi error, pero muchas veces esto es solo marginalmente útil. Por ejemplo, a veces ninguno de los mensajes en la pila/hilo/lo que sea ni siquiera es mi código. Otras veces es mi código, pero en la parte superior de la pila habrá un mensaje que tiene 4+ parámetros, ok thanks depurador lo redujo a 4 punteros posibles ¿por qué no puede decirme cuál?

Supongo que hay una explicación fundamental que eché de menos por los antecedentes de los que vengo, sin tener que preocuparme por la memoria ni nada parecido. Aunque hay un error que puede ocurrir mucho en el desarrollo de AS3 que es igualmente misterioso y en la misma línea. "Error n. ° 1009: no se puede acceder a una propiedad o método de una referencia de objeto nulo", que casi siempre significa que una variable que esperaba contener algo es en realidad nula. ¿Por qué no me dice CUAL variable?

+0

Utilice y siga este enlace: http://www.touch-code-magazine.com/how-to-debug-exc_bad_access/ Espero que resuelva su problema. – shah

Respuesta

18

Porque el tiempo de ejecución de Objective-C es bastante pequeño y simple, a propósito. Prácticamente estás codificando una aplicación nativa que está colocada sobre el metal. La aplicación no tiene idea de por qué tienes un EXC_BAD_ACCESS, todo lo que sabe es que trataste de hacer algo y el sistema operativo dijo que no. EXC_BAD_ACCESS significa que está intentando acceder al espacio de memoria que el sistema operativo no le proporcionó.

En Flash, Java, .NET, etc., hay un tiempo de ejecución robusto y potente allí donde se ejecuta la aplicación. Tiene mucho más contexto, y sabe mucho más sobre lo que está sucediendo. Entonces, un beneficio de un entorno como este es un mensaje de error mucho más claro, generalmente con un seguimiento de pila completo.

Xcode puede ayudarte a ver zombificar tus objetos. En lugar de desasignarlos, se convertirán en zombis y gritarán un asesinato sangriento si intentas usarlos de nuevo. Lo cual ayuda a precisar la causa.

También puede que desee ver en el Technical Q&A o la Debugging Magic

+2

Para obtener una visión detallada de los zombis, busque NSZombieEnabled – Joost

+0

Gracias Matt por ser uno de los muchos que realmente captaron el espíritu de mi pregunta. Como mencioné sabía que había herramientas para empujarme en la dirección correcta, simplemente intentaba entender por qué necesitaba esas herramientas adicionales. ¡Buena respuesta! :) – Dustin

+0

Ah, gracias por el consejo de Zombie también, aunque todavía no me dice qué puntero por nombre ... – Dustin

0

por qué no puede darle más información sobre el problema.

Porque no tiene más información que eso. Por supuesto, podría hacer un seguimiento de todo tipo de información de depuración, pero eso ralentizaría el programa.

0

Por ejemplo ¿por qué no qué dice "EXC_BAD_ACCESS, que intentó pasar suchAndSuch puntero en la línea 123, sin embargo, eres un idiota, ya que se lo soltó en la línea 69 así que no es lo habrá mas"?

Piensa en lo que debería suceder para hacer un seguimiento de esto todo el tiempo. Ejecútelo bajo un depurador que mira los allocs y libera si desea depurar esto.

Aunque hay un error que puede ocurrir mucho en el desarrollo AS3 que es igualmente misterioso y en la misma línea."Error n. ° 1009: no se puede acceder a una propiedad o método de una referencia de objeto nulo", que casi siempre significa que una variable que esperaba contener algo es en realidad nula. ¿Por qué no me dice CUAL variable?

El tiempo de ejecución no tiene su código fuente.

Básicamente, esto se reduce a "Si desea depurar código, ejecútelo bajo un depurador".

0

Ejecútelo a través de un depurador. Cuando obtenga la excepción EXC_BAD_ACCESS, examine la traza inversa y en cada trama inspeccione los valores de las variables locales. Además, coloque algunos asertos aquí y allá solo para asegurarse de que los valores sean los que espera que sean.