我正在使用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
答案 0 :(得分:2)
我正在使用Xcode 4.2.1和lldb。切换到gdb解决了这个问题。
答案 1 :(得分:1)
我不清楚你的问题是什么,但是这份文件可能有所帮助:
答案 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,它就像一个魅力。
希望他们能解决这个问题,或者最终我会知道错误的来源。