2010-05-16 9 views
6

Estoy trabajando en un proyecto en xCode para iPhone donde recibo un error EXC_BAD_ACCESS, SIN EMBARGO, solo recibo el error al pasar por una función que estoy tratando de depurar. Cuando elimino mi punto de interrupción de la función, pero sigo ejecutando el proyecto en modo de depuración, nunca recibo este error. ¿Hay alguna forma de solucionar esto o averiguar qué está causando el error EXC_BAD_ACCESS?xCode para iPhone ¿EXC_BAD_ACCESS error solo ocurre al pasar por el depurador?

El error viene en la línea: for (BEUCharacterAIBehavior *behavior in behavior_.behaviors)

Sin embargo, cuando paso a paso por los behavior_.behaviors valor es asignado y retenido. NSZombiesEnabled está configurado pero aún recibe el mensaje de error críptico.

Código:

-(BEUCharacterAIBehavior *)getHighestValueBehaviorFromBehavior:(BEUCharacterAIBehavior *)behavior_ { 
//if the behavior is a leaf then stop checking because there are no sub behaviors 
if([behavior_ isLeaf]) return behavior_; 


//temp variable for highest value behavior so far 
BEUCharacterAIBehavior *highest = nil; 
//NSLog(@"BEHAVIORS:%@",behavior_.behaviors); 
for (BEUCharacterAIBehavior *behavior in behavior_.behaviors) 
{ 

    //if there is a highest value behavior check if the highest value behavior has a larger value than the new one 
    if(highest) 
    { 
     if(highest.lastValue > behavior.value) continue; 
    } 

    //if there is no current behavior then the highest is now the behavior were checking because we have nothing to check against 
    if(!currentBehavior) highest = behavior; 
    //Make sure the current behavior is not the same behavior as the new one 
    else if(currentBehavior != behavior) 
    { 
     //can the new behaviors parent run multiple times in a row 
     if(!behavior.parent.canRunMultipleTimesInARow) 
     { 
      //make sure the current and new behaviors parents arent the same if they are continue to next behavior 
      if(currentBehavior.parent != behavior.parent) 
      { 
       continue; 
      } 
     } 

     highest = behavior; 
     //If current behavior and new behavior are the same make sure they can run multiple times 
    } else if(currentBehavior.canRunMultipleTimesInARow) 
    { 
     highest = currentBehavior; 
    } 
} 
//NSLog(@"GOING TO GET HIGHEST VALUE BEHAVIOR FROM BEHAVIOR: %d",highest.retainCount); 
if(!highest) return nil; 
return [self getHighestValueBehaviorFromBehavior:highest];//highest; 

}

pila Error

0 0x02aebdcb en object_getClass
1 0x00002ac0 en
2 0x00014bb9 en - [BEUCharacterAI getHighestValueBehaviorFromBehavior:] en BEUCharacterAI.m: 115
3 0x00014b6b in - [BEUCharacterAI getHighestValueBehavior] en BEUCharacterAI.m: 103
4 0x00014904 en - [actualización BEUCharacterAI:] en BEUCharacterAI.m: 68
5 0x00008975 en - [BEUCharacter paso:] en BEUCharacter.m: 229
6 0x00022aeb en - [paso EskimoCharacter:] en EskimoCharacter.m: 28
7 0x0000ed2b en - [BEUObjectController paso:] en BEUObjectController.m: 381
8 0x00003651 en - [paso BEUGame:] en BEUGame.m: 63
9 0x0007cc42 en - [fuego CCTimer:] en CCScheduler.m : 87
10 0x0007d846 en - [tick CCScheduler:] en CCScheduler.m: 212
11 0x000500b3 en - [CCDirector mainloop] en CCDirector.m: 208
12 0x000532b3 en - [CC DisplayLinkDirector preMainLoop:] en CCDirector.m: 1055
13 0x00796f06 en CA :: Display :: :: DisplayLink despacho
14 0x0079704b en CA :: Display :: :: EmulatorDisplayLink devolución de llamada
15 0x029810f3 en CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION
16 0x02982734 en __CFRunLoopDoTimer
17 0x028df689 en __CFRunLoopRun
18 0x028dec00 en CFRunLoopRunSpecific
19 0x028deb21 en CFRunLoopRunInMode
20 0x03e96378 en GSEventRunModal
21 0x03e9643d en GSEven TRUN
22 0x0083bf89 en UIApplicationMain
23 0x00002b50 en principal en main.m: 13

+0

No tenía mi dispositivo para probar cuando recibía este error, pero una vez que depuré y avancé en mi dispositivo, no ocurren errores. Entonces esto parece ser solo un simulador. –

Respuesta

1

¿Tienes otros hilos en ejecución? Podría ser que algo más esté modificando behavior_.behaviors o simplemente behavior_ mientras tu loop se está ejecutando, pero la ventana es bastante pequeña a menos que el bucle se ejecute muy despacio.Podría tratar de poner un largo sueño en el ciclo para simular la depuración y ver si eso hace que el bloqueo ocurra cuando se ejecuta fuera del depurador.

1

He visto esto también en las pruebas de unidad de funcionamiento XCode 4 en el simulador. En este punto, lo estoy atribuyendo a un error en el simulador de iOS en alguna parte.

Voy a editar esta respuesta si descubro más.

1

Yo también recibo este comportamiento cuando uso el depurador en Xcode 4. Pongo puntos de interrupción en mi código, en mis clases que son subclases de SenTestCase. Me ejecuto a través de Producto -> Prueba en Xcode.

constantemente consigo el error en esta declaración:

Node *newEntry = [[Node alloc] initWithPayload:payload]; 

Me único puesto que el código en caso de que alguien lo está experimentando en una -alloc o -init ....

Cuando corro Producto -> Prueba después de eliminar todos los puntos de interrupción, el código se ejecuta correctamente (incluida la línea invocada repetidamente) y todas las pruebas se completan correctamente.

Just FYI en caso de que alguien esté experimentando lo mismo.

+0

Creo que esta respuesta a la pregunta sería más adecuada como un comentario sobre la pregunta original, en lugar de una respuesta. Especialmente porque no parece responder a la pregunta original. – Boeckm

2

Estaba teniendo esto con Xcode 4.2.1 y lldb. Cambiar a gdb resolvió el problema.

0

Aparece el error en cada línea en la que pongo mi Breakpoint.

Incluso en

NSError *error = nil; 

EXC_BAD_ACCESS!

El depurador sin puntos de interrupción funciona sin problemas. En simulador y dispositivo, se ejecuta sin problemas. Sin depurador tampoco hay problema. Estoy usando LLVM LDB 3.0.

AHORA He swtiched a GDB en mi esquema en "Ejecutar" y funciona como un encanto.

Espero que lo arreglen, o eventualmente sabré de dónde viene el error.

Cuestiones relacionadas