2009-01-10 12 views
7

estoy recibiendo este mensaje cada vez que puedo compilar mi proyecto:¿Qué es una "trampa de anulación" y cómo la elimino?

RunIPhoneUnitTest.sh: line 92: 31389 Abort trap    "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents 

entiendo es un problema en mi código, pero entonces yo no figuran cómo resolver o lo encontraron.

Lo extraño, es que me sale esto con la siguiente llamada:

-- This is the interface 
@interface DbObject : NSObject { 
    NSInteger Id; 
    NSDate* timeStamp; 
} 

@property (nonatomic) NSInteger Id; 
@property (nonatomic, retain) NSDate *timeStamp; 
---- 
This fail with above error 
---- 
NSString * filter = [NSString stringWithFormat:"id = %@", ds.Id, nil]; 

pero lo wird es que elimino esa línea, ese método y todavía lo entiendo! Está volviendo loco.

Actualmente, estoy pensando en el código de eliminación hasta que no conseguir un comienzo de error & añadiendo que, de preguntarse si existe una solución más pragmática ...

Respuesta

11

un aborto trampa por lo general significa que abortar fue llamado en alguna parte. Es muy probable que esto ocurra porque el código del arnés de prueba de su unidad arroja una excepción que no está esperando y simplemente maneja esto llamando a abort (3). La llamada abortada no es muy fácil de depurar porque no proporciona información sobre quién la llamó o por qué, nunca regresa y genera un SIGABRT. Puede instalar un nuevo controlador para SIGABRT y colocar allí un punto de interrupción y, al menos, examinar la pila de llamadas actual ... pero lea el resto para obtener información sobre por qué ocurre esto en primer lugar.

Sin embargo, el problema con su código anterior es que NSInteger no es un tipo de objeto, es una primitiva regular. Para corregir el error, sustituya la línea de falla con esto:

NSString *filter = [NSString stringWithFormat:@"id = %lld", (long long)ds.Id]; 

En primer lugar, stringWithFormat toma un objeto NSString como un parámetro, por lo que es necesario utilizar el carácter '@' para especificar que la cadena literal es un NSString. Esto es muy importante ya que @"blah blah" se traduce a un objeto. La llamada que está realizando al stringWithFormat espera que la información del objeto NSString resida en esa dirección de memoria, pero en su lugar está obteniendo una cadena de caracteres y es muy probable que explote allí. Asegúrese de que todos los literales de cadena sean @"blah blah" donde se espera un tipo NSString y que no son cadenas simples c-strings.

En segundo lugar, el carácter '@' en la cadena de formato especifica un objeto. Como NSInteger no es un objeto, no puede usar este caracter de formato. En su lugar, use% lld para especificar un entero largo largo. Finalmente, no necesita agregar nil al final de la lista de parámetros cuando usa stringWithFormat ya que la cadena de formato especifica cuántos parámetros esperar.

Como un aparte, la razón por la que se usa %lld en lugar de solo %d es que NSInteger cambia de tamaño dependiendo de si está compilando para un objetivo de 32 bits o de 64 bits. Al promover el NSInteger al tipo long long y al usar el especificador %lld, se asegura de que no tendrá problemas de truncamiento en el futuro si compila para 64 bits y su valor NSInteger requiere más de 32 bits para almacenar.

Cuestiones relacionadas