xCode for iPhone EXC_BAD_ACCESS错误仅在单步调试时发生?

时间:2010-05-16 18:29:34

标签: iphone xcode exc-bad-access

我正在使用xCode for iPhone中的一个项目,我收到一个EXC_BAD_ACCESS错误,但是,我只是在单步执行我试图调试的函数时收到错误。当我关闭函数断点,但仍然在调试模式下运行项目时,我从未收到此错误。无论如何要解决这个问题或找出导致EXC_BAD_ACCESS错误的原因。

错误来自:for ( BEUCharacterAIBehavior *behavior in behavior_.behaviors )

但是,当单步执行值behavior_.behaviors时,会分配并保留。 NSZombiesEnabled已设置但仍然收到神秘的错误消息。

代码:

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

}

错误堆栈

object_getClass中的

0 0x02aebdcb 中的1 0x00002ac0 2 0x00014bb9 in - [BEUCharacterAI getHighestValueBehaviorFromBehavior:]在BEUCharacterAI.m:115
3 0x00014b6b in - [BEUCharacterAI getHighestValueBehavior]在BEUCharacterAI.m:103
4 0x00014904 in - [BEUCharacterAI更新:]在BEUCharacterAI.m:68
5 0x00008975 in - [BEUCharacter step:]在BEUCharacter.m:229
6 0x00022aeb in - [EskimoCharacter步骤:]在EskimoCharacter.m:28
7 0x0000ed2b in - [BEUObjectController步骤:]在BEUObjectController.m:381
8 0x00003651 in - [BEUGame step:]在BEUGame.m:63
9 0x0007cc42 in - [CCTimer fire:]在CCScheduler.m:87
10 0x0007d846 in - [CCScheduler tick:]在CCScheduler.m:212
11 0x000500b3 in - CCDirector.m中的[CCDirector mainLoop]:208
12 0x000532b3 in - CCDirector.m中的[CCDisplayLinkDirector preMainLoop:]:1055
13 0x00796f06在CA :: Display :: DisplayLink :: dispatch中 14 0x0079704b在CA :: Display :: EmulatorDisplayLink :: callback中 15 0x029810f3 CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION
16 0x02982734在__CFRunLoopDoTimer中 17 _ 0xC28Lf689在__CFRunLoopRun中 18 CFRunLoopRunSpecific中的0x028dec00
19 CFOunLoopRunInMode中的0x028deb21 GSEventRunModal中的20 0x03e96378 21 GSOXventRun中的0x03e9643d
UIApplicationMain中的22 0x0083bf89
在main.m的主要位置为23 0x00002b50:13

6 个答案:

答案 0 :(得分:2)

我正在使用Xcode 4.2.1和lldb。切换到gdb解决了这个问题。

答案 1 :(得分:1)

我不清楚你的问题是什么,但是这份文件可能有所帮助:

Mac OS X Debugging Magic

答案 2 :(得分:1)

你有其他线程在运行吗?可能是在你的循环运行时,其他东西正在修改behavior_.behaviors或简单的行为_但是窗口非常小,除非循环运行得非常慢。您可以尝试在循环中进行长时间休眠以模拟调试,看看是否会在调试器外部运行时发生崩溃。

答案 3 :(得分:1)

我在模拟器中运行XCode 4运行单元测试时也看到了这一点。在这一点上,我正在将它变成某个地方的iOS模拟器中的一个错误。

如果我发现更多,我会编辑这个答案。

答案 4 :(得分:1)

我也是在Xcode 4中使用调试器时遇到这种行为。我在我的代码中放置了断点,在我的类中是SenTestCase的子类。我通过产品运行 - >在Xcode中测试。

我一直在这句话中得到错误:

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

我只发布该代码,以防任何人在-alloc或-init上遇到它....

当我运行Product - >删除所有断点后进行测试,代码运行正常(包括重复调用的上述行),测试全部成功完成。

仅供参考,以防有人遇到同样情况。

答案 5 :(得分:0)

我在打开断点的每一行都收到错误。

即使在

NSError *error = nil;

EXC_BAD_ACCESS!

没有断点的调试器运行顺利。 在模拟器和设备上运行没有问题。没有调试器也没问题。 我使用的是LLVM LDB 3.0。

现在,我在“Run”下的计划中将GDB交给GDB,它就像一个魅力。

希望他们能解决这个问题,或者最终我会知道错误的来源。