2012-03-29 18 views
5

Mi aplicación se bloqueaba solo cuando no se ejecutaba con el depurador XCode. Fue difícil hacer un seguimiento porque no puedo depurar, pero finalmente lo descubrí. Fue a causa de la publicación de un objeto que no era de mi propiedad. Antes lo corregí Busqué y encontré 2 preguntas relacionadas aquí (enlaces más abajo)iOS falla solo cuando NO se ejecuta a través de XCode. Concidence?

iOS App Crashes when running by itself on device, does not crash when running through Xcode using debugger, or in simulator

iPhone crash only when device not connected to xcode, how to understand the crash log?

Ninguno de la pregunta anterior ha respondido por qué ningún accidente cuando se ejecuta a través de debugger.So mi pregunta es ¿por qué Sucede ? Conozco los motivos de los bloqueos específicos de depuración/liberación, pero esto es una locura. Es solo por casualidad, aunque sucedió más de 10 veces.

+0

¿Has probado la creación de perfiles con Zombies habilitados? – CodaFi

+0

No, pero lo descubrí buscando en el método dealloc que estoy enviando un mensaje de liberación a un objeto zombie. – msk

Respuesta

2

Lo que usted describe no es atípico de errores oscuros relacionados con la memoria. Es posible que también desee utilizar debug-malloc en esos momentos. Aunque eso no está garantizado para encontrar todo. La razón (y ha estado sucediendo probablemente siempre que haya habido depuradores de nivel de fuente) es que la memoria se presenta al menos de forma algo diferente en el código depurable y cuando se ejecuta bajo el depurador. Por lo tanto, el error da como resultado que una parte diferente de la memoria se dañe (inofensivamente) cuando se encuentra debajo del depurador. Cuando no está bajo el depurador, la ubicación está dañada y es algo que a su código le preocupa y se bloquea.

Lo mismo podría suceder a la inversa, pero nunca se sabe - si se bloquea cuando se ejecuta depurable, que iba a encontrar que antes de cambiar a correr fuera del entorno de depuración.

0

tuve este problema al acceder a bases de datos SQLite desde fuera del directorio [[NSBundle mainBundle] ResourcePath], lo que provocó errores de iCloud.

Descubrí el error solo al instalar la consola en mi iPhone que registraba los errores.

http://itunes.apple.com/us/app/console/id317676250

Una vez que accede a las bases de datos en el directorio correcto, los errores desaparecieron y la aplicación arrancado correctamente.

0

que experimentaron este síntoma cuando hice una NSString, envié una UTF8String de ella a otro objeto, y le asignó a un puntero char. Bueno, resulta que olvidé retener el NSString original, lo que no hubiera importado de todos modos, ya que tampoco me había dado cuenta de que el método UTF8String (que presumiblemente es un objeto que da acceso al puntero) opera en el autorelease piscina. Es decir, conservar el NSString no solucionó el problema.

supongo que esto parecía funcionar bien cuando se monta en el depurador sólo porque me había permitido a los zombis, por lo que el puntero que tenía todavía era válida. Debería ver si esta es la razón por la que funcionó; si es así, esta es una buena razón para probar con y sin NSZombie habilitado.

En cualquier caso, esto era probablemente un mal diseño, para empezar, y una gestión de memoria error novato bastante obvio una vez que lo encontré. Afortunadamente, la consola en la ventana de Organizer me dio algunas pistas sobre dónde empezar a buscar, y la depuración finalmente me mostró dónde estaba cambiando el valor de mi puntero. Espero que esto ayude a cualquiera que encuentre el camino hasta aquí.

0

que estaba teniendo este problema, así y tuvo la suerte de averiguar la causa rápidamente, es de esperar mediante la publicación aquí puedo salvar a otra persona alguna pérdida de tiempo. Para aclarar, mi aplicación se ejecutará sin problemas cuando se lance directamente desde XCode, pero se bloqueará inmediatamente cuando se lance manualmente en el iPad.

La aplicación en cuestión está escrita en Obj-C pero se basa en un código de terceros escrito en Swift. El código Swift está incluido en la aplicación como un marco incrustado. Tuve que establecer "Contenido incrustado contiene código Swift" en "Sí" en la Configuración de compilación para la aplicación (en Opciones de compilación), luego el problema desapareció.

Cuestiones relacionadas