2010-12-22 14 views
13

Desde el interior NSManagedObjectContext -save: estoy recibiendo este mensaje:Depuración SIGABRT dentro NSManagedObjectContext -save:

aserción: (_Unwind_SjLj_Resume() no puede devolver), la función _Unwind_SjLj_Resume, archivo/SourceCache/libunwind /libunwind-24.1/src/Unwind-sjlj.c, línea 326.

Señal de programa recibido: "SIGABRT".

advertencia: No se puede leer símbolos de /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148) /Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (archivo no encontrado).

Esto sucede cuando elimino un objeto Experimento con to-many con Ejecutar que tiene muchos con Muestra que tiene uno con Datos. El experimento también tiene que-muchos con la página que tiene-muchos con la pantalla que tiene que-muchos para ejecutar. Menciono esto para señalar la naturaleza cíclica del gráfico. Aquí es un gráfico simplificado del modelo:

alt text

Un experimento una entidad de nivel superior con la que interactúa el usuario. Un experimento contiene múltiples objetos de ejecución. Una ejecución es una colección de datos que comienza en un momento determinado y termina en otro momento. Como los datos se pueden recopilar de múltiples fuentes simultáneamente, hay una Muestra para cada fuente para cada Ejecución. Un experimento contiene datos y estos datos deben ser vistos e interactuados. Por lo tanto, cada experimento tiene un número de objetos de página y cada página contiene un número determinado de pantallas (por ejemplo, gráficos, metros). Una pantalla está configurada para mostrar algún subconjunto de las ejecuciones que pertenecen al experimento. Por lo tanto, aunque un experimento puede contener docenas de ejecuciones, una de sus páginas solo mostrará algunas de esas ejecuciones a la vez. La entidad de visualización mantiene esta lista. Una pantalla es no a vista. Una vista hará referencia a un objeto de visualización y recibirá notificaciones de cambios en el objeto de visualización.

He estado utilizando las reglas de eliminación pero ahora he cambiado a las reglas de eliminación "Sin acción" en combinación con los métodos -prepareForDeletion para todas estas clases. Este cambio no hizo diferencia. En ambos casos, el mensaje de error es el mismo.

Curiosamente, cuando reinicio la aplicación, se han eliminado todos los objetos marcados para su eliminación.

Además, si un experimento no tiene objetos Run, la eliminación funciona sin incidencias. Para el caso, eliminar una única ejecución de un experimento también funciona.

Espero que alguien haya visto algo como esto y pueda ofrecer consejos sobre lo que podría causar esto. O bien, si alguien tiene consejos sobre cómo obtener libXcodeDebuggerSupport.dylib para iOS 4.2.1, eso también podría ser útil.

Actualización: Seguí el consejo encontró here y fue capaz de conseguir Xcode para encontrar libXcodeDebuggerSupport.dylib para iOS 4.2.1. Pero esto no ayudó en absoluto a diagnosticar el problema, que persiste.

Actualización 2: Después de leer un poco y descargar una versión de unwind-sjlj.c, parece que estoy tratando con algo así como una excepción no detectada. No estoy seguro de cómo esto me ayuda ...

Actualización 3: Gracias a Kamchatka, hice algo que probablemente debería haber hecho hace unos días: activado "Stop on Objective-C Exceptions". Esto me permitió ver que todavía se estaba reteniendo una referencia a un objeto eliminado y, lo que es peor, que era clave-valor al observar el objeto eliminado. Solucioné este problema solucionado y pude volver a usar las reglas de eliminación en lugar de los métodos -prepareForDeletion.

+0

¿Cuál fue su regla de eliminación original? Cascasde hasta el nivel de datos? ¿Hay algún motivo por el que la Pantalla tenga acceso directo a las Carreras en lugar de pasar por el árbol Página/Experimento? –

+0

Actualiza Xcode a 3.2.5 para deshacerte de la advertencia del depurador. Su dispositivo es 4.2.1 que requiere símbolos de depuración actualizados de 3.2.5 –

+0

@Michael: La pantalla administra las ejecuciones que se muestran para una página específica, por lo que siempre será un subconjunto de ejecuciones contenidas en un experimento. Podría haber varias páginas para un experimento en particular, cada una con múltiples pantallas y cada pantalla mostrando un conjunto de ejecuciones. Espero que esto tenga sentido. – westsider

Respuesta

16

Debería intentar activar "Ejecutar> Detener en la excepción Objective-C". Me permitió encontrar el lugar donde había un acceso a un objeto convertido en culpa, que era la causa del problema.

+1

Siguiendo este consejo, pude rastrear la causa de mis fallas. Tenía un código KVO que hacía referencia a un objeto eliminado, y este código se activaba durante el proceso de eliminación. Entonces, finalmente, el problema estaba en un método de -dealloc. – westsider

+5

¿Dónde está esta configuración en XCode4? – tomwhipple

+2

@tomwhipple: ver http://stackoverflow.com/questions/4961770/run-stop-on-objective-c-exception-in-xcode-4 – RickDT