2010-05-16 2 views
6

Ich arbeite an einem Projekt in xCode für iPhone, wo ich einen Fehler EXC_BAD_ACCESS empfange, aber ich erhalte nur den Fehler beim Durchlaufen einer Funktion, die ich versuchen zu debuggen. Wenn ich meinen Haltepunkt von der Funktion entferne, aber das Projekt immer noch im Debug-Modus laufe, erhalte ich diesen Fehler nie. Gibt es trotzdem, um dies zu lösen oder herauszufinden, was den Fehler EXC_BAD_ACCESS verursacht.xCode für iPhone EXC_BAD_ACCESS Fehler tritt nur auf, wenn Sie durch den Debugger gehen?

Der Fehler kommt auf der Linie: for (BEUCharacterAIBehavior *behavior in behavior_.behaviors)

jedoch, wenn sie durch den Wert behavior_.behaviors Schritt zugeordnet und gehalten. NSZombiesEnabled ist gesetzt, aber immer noch die kryptische Fehlermeldung.

Code:

-(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; 

}

Fehlerstapel

0 0x02aebdcb in object_getClass
1 0x00002ac0 in
0x00014bb9 2 in - [BEUCharacterAI getHighestValueBehaviorFromBehavior:] bei BEUCharacterAI.m: 115
3 0x00014b6b in - [BEUCharacterAI getHighestValueBehavior] bei BEUCharacterAI.m: 103
4 0x00014904 in - [BEUCharacterAI Update:] bei BEUCharacterAI.m: 68
5 0x00008975 in - [BEUCharacter Schritt:] bei BEUCharacter.m: 229
6 0x00022aeb in - [EskimoCharacter Schritt:] bei EskimoCharacter.m: 28
7 0x0000ed2b in - [BEUObjectController Schritt:] bei BEUObjectController.m: 381
8 0x00003651 in - [BEUGame Schritt:] bei BEUGame.m: 63
9 0x0007cc42 in - [CCTimer Feuer] bei CCScheduler.m : 87
10 0x0007d846 in - [CCScheduler Tick:] bei CCScheduler.m: 212
11 0x000500b3 in - [CCDirector mainLoop] bei CCDirector.m: 208
12 0x000532b3 in - [CC DisplayLinkDirector preMainLoop:] bei CCDirector.m: 1055
13 0x00796f06 in CA :: Display :: Display :: dispatch
14 0x0079704b in CA :: Display :: EmulatorDisplayLink :: Rückruf
15 0x029810f3 in CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION
16 0x02982734 in __CFRunLoopDoTimer
17 0x028df689 in __CFRunLoopRun
18 0x028dec00 in CFRunLoopRunSpecific
19 0x028deb21 in CFRunLoopRunInMode
20 0x03e96378 in GSEventRunModal
21 0x03e9643d in GSEven Trun
22 0x0083bf89 in UIApplicationMain
23 0x00002b50 in Haupt bei main.m: 13

+0

Ich hatte nicht mein Gerät zu testen, wenn ich diesen Fehler bekam, aber sobald ich debuggte und trat auf meinem Gerät durch, keine Fehler passieren. Dies scheint also nur ein Simulator zu sein. –

Antwort

1

Haben Sie andere Threads ausgeführt? Es könnte sein, dass etwas anderes behavior_.behaviors oder einfach behavior_ während der Ausführung der Schleife verändert, aber das Fenster ist ziemlich klein, es sei denn, die Schleife läuft wirklich langsam.Sie könnten versuchen, einen langen Schlaf in die Schleife zu legen, um das Debuggen zu simulieren und zu sehen, ob das den Absturz verursacht, wenn Sie außerhalb des Debuggers laufen.

1

Ich habe dies auch unter XCode 4 Laufeinheit Tests im Simulator gesehen. An dieser Stelle erkläre ich es irgendwo im iOS Simulator auf einen Fehler.

Ich werde diese Antwort bearbeiten, wenn ich mehr entdecke.

1

Auch ich bekomme dieses Verhalten, wenn Sie den Debugger in Xcode 4 verwenden. Ich platziere Haltepunkte in meinem Code, in meinen Klassen, die Unterklassen von SenTestCase sind. Ich laufe über Produkt -> Test in Xcode.

ich den Fehler konsequent erhalten auf diese Aussage:

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

ich diesen Code falls jemand nur Post ist es auf einem -alloc oder -init erleben ....

Wenn ich laufen Produkt -> Test nach dem Entfernen aller Haltepunkte, der Code läuft gut (einschließlich der oben genannten Zeile wiederholt aufgerufen) und die Tests alle erfolgreich abgeschlossen.

Nur für den Fall, dass jemand das gleiche erlebt.

+0

Ich denke, diese Antwort auf die Frage wäre besser als Kommentar zu der ursprünglichen Frage geeignet, als eine Antwort. Vor allem, weil es die ursprüngliche Frage nicht zu beantworten scheint. – Boeckm

2

Ich hatte dies mit Xcode 4.2.1 und lldb. Die Umstellung auf gdb hat das Problem gelöst.

0

Ich bekomme den Fehler auf jeder Zeile, die ich meine Breakpoint eingeschaltet.

Auch auf

NSError *error = nil; 

EXC_BAD_ACCESS!

Debugger ohne Breakpoints läuft reibungslos. Auf Simulator und Gerät, läuft ohne Probleme. Ohne Debugger auch kein Problem. Ich verwende LLVM LDB 3.0.

JETZT habe ich zu GDB in meinem Scheme unter "Run" geschaltet und es funktioniert wie ein Zauber.

Hoffentlich werden sie das beheben, oder irgendwann werde ich wissen, wo der Fehler herkommt.

Verwandte Themen