2010-09-13 13 views
25

Desde que actualicé Xcode 3.2.3 a 3.2.4 y iOS 4.0.1 a iOS 4.1 SDK, cuando configuro un punto de interrupción en mi código y paso a paso las instrucciones, en cada paso, el depurador escupirá uno o más de esa línea:Obteniendo un mensaje extraño de depuración: Aserción fallida: (cls), función getName: ¿qué es esto?

Assertion failed: (cls), function getName, file /SourceCache/objc4_Sim/objc4-427.1.1/runtime/objc-runtime-new.m, line 3939

Esto no sucede en una línea específica o por instrucciones específicas. Tengo algunos puntos de interrupción en mi código y cada vez que toco uno de ellos, el depurador comienza a arrojar esos mensajes. No parece tener ningún efecto perjudicial ya que el programa funciona correctamente. Es muy molesto recuperar la información en la consola cuando hay decenas de esas líneas. Estoy seguro de que no se muestran para nada, pero no he encontrado cuál podría ser el problema y qué instrucción podría causarlo. Si no alcanzo un punto de interrupción, entonces no veo ninguna de esas líneas. Limpié y reconstruí mi proyecto varias veces sin éxito.

¿Alguien tiene alguna idea de lo que es esto?

+0

También tengo este problema, aunque parezca que solo lo consigo con el simulador de iPad, no cuando ejecuto el simulador de iPhone. –

+0

Tienen el problema también. Apareció cuando (inusualmente) ejecuté mi aplicación en el simulador. ¿Lo tienes en Sim o dispositivo o ambos? – Kalle

Respuesta

0

Tengo exactamente el mismo problema. Sé que no es la respuesta completa, pero esto es lo que pude encontrar.

El getNombre función relevante es así:

/*********************************************************************** 
* getName 
* fixme 
* Locking: runtimeLock must be held by the caller 
**********************************************************************/ 
static const char * 
getName(struct class_t *cls) 
{ 
    // fixme hack rwlock_assert_writing(&runtimeLock); 
    assert(cls); 

    if (isRealized(cls)) { 
     return cls->data->ro->name; 
    } else { 
     return ((const struct class_ro_t *)cls->data)->name; 
    } 
} 

Así GDB se queja de que la aserción afirmación (CLS) está fallando. Lo que significa que getName de alguna manera obtiene un puntero NULL como argumento.

Lo que es un poco raro, ¿dónde podríamos estar preguntando el nombre de una clase NULL?

Espero que esto ayude ...

+2

BTW assert (cls) obviamente está marcado como un truco. Esta podría ser la causa de nuestros problemas? –

+0

No tengo ni idea de dónde viene esto. No estoy usando ningún NSKeyedUnarchiver. Yo convierto un NSString en una lista adecuada pero el mensaje en la consola aparece en cualquier instrucción, incluso antes de enviar 'propertyList' a la cadena, así que estoy desconcertado. – nemesys

+0

Cuando tenga tiempo, creo que intentaré agregar algún punto de interrupción en esa función getName para ver de dónde provienen las llamadas. Con suerte, eso me puede decir lo que hice que lo desencadena ... – nemesys

0

también tengo el mismo problema; No tengo una solución, pero puedo evitarla. En resumen, sugiero que agregue más puntos de interrupción ...

Noté en la pila de llamadas que en realidad es el depurador el que se está portando mal. La función gdb_class_getClass llama al getName, presumiblemente esto pasa NULL en lugar de (digamos) MyClass. El código que intento depurar es un método de MyClass. Entonces, pensando que el depurador tiene un problema con MyClass, configuro un punto de interrupción en una línea fuera de cualquier código de MyClass (es decir, la línea que llama al método en MyClass) y presiono continuar cuando se rompe el programa. Esto parece resolver el problema en mi caso. (Tenga en cuenta que la continuación automática no funciona.)

Para que quede claro:

//Set breakpoint here 
[myClassInstance buggyMethod]; 

Mi buggyMethod es en realidad en otro archivo:

... 
-(void)buggyMethod { 
    //This is where I set my 'real' breakpoint 

Espero que ayude.

0

Tengo un problema similar, pero el mío es crear una vista personalizada con texto principal. Tan pronto como mi punto de vista de drawRect llama a la línea de

CTFontRef titleFont = CTFontCreateWithName(CFSTR("Baskerville"), 40.0f, NULL); 

Se cuelga la aplicación, ya sea en el simulador o en el dispositivo. Curiosamente, puedo rectificar esto alocando otro componente de texto UIKit en el método viewDidLoad del Controlador de Vista ... Ni siquiera tengo que agregarlo como una subvista. Es como si necesitara cargar algunos elementos de texto comunes antes de que Core Text pueda cargar fuentes.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];   
} 

Weird.

5

Me encontré con esto - y esta es la razón por la que sucedió la mía: había usado +localizedStringFromDate:dateStyle:timeStyle: en mi código. Funcionó bien en el iPhone, pero no está disponible antes de 4.0 SDK, por lo que tosió en el iPad. Vea si está llamando a alguna rutina que ya no está disponible en el SDK, o disponible solo en versiones posteriores. Francamente, ¡no puedo esperar 4.1 en el iPad!

-Owen

+0

Gracias, Owen, lo comprobaré! – nemesys

2

También estoy teniendo este problema, en una aplicación para iPad escrita originalmente en Xcode 3.2.4 utilizando el SDK de iOS 3.2, ahora se está depurando en Xcode 3.2.5 utilizando el SDK 4.2, pero sólo cuando configuro el simulador para el 3.2 Objetivo de implementación de iOS (para poder ejecutarlo en el simulador 3.2). Cada parada en un punto de interrupción en el depurador, obtengo esta afirmación repetida ocho veces. Un solo paso sobre una línea obtiene dos más.

Lo que no puedo entender es que no he agregado ningún código al proyecto desde la última vez que lo ejecuté en Xcode 3.2.4 y iOS SDK 3.2, así que no puedo haber agregado ninguna llamada que no estuviera presente en ese SDK o de lo contrario no se habría compilado.

Hasta que alguien encuentre una respuesta a esto, creo que la única solución (para poder continuar depurando mi código en un entorno 3.2) es reinstalar Xcode 3.2.4 y usar el 3.2 SDK y el simulador.

1

Tuve este problema cuando estaba corriendo en el simulador "iPad 3.2 simulator". Este problema desapareció cuando cambié el simulador al "simulador de iPad 4.3"

Cuestiones relacionadas