当方法返回特定值时,如何在Xcode中设置“智能”断点?

时间:2011-01-19 18:01:19

标签: xcode debugging breakpoints

我有一个返回bool值的方法,有几个退出点。 但是,它似乎无法正常工作,所以我想设置一个自动断点来查看它何时返回YES值,这样我就可以检查调试器中的所有变量和计算。 我想在返回YES值时停止调试器。

我为objc_exception_throw设置了类似的智能断点,所以我知道这是可能的,我只是不确定如何。


(如果它可以帮助任何人,你可以设置异常断点的方式:在Breakpoints窗口(Run - > Show - > Breakpoints)中输入objc_exception_throw作为“断点”,并{{1} }作为“位置”)

编辑:我想用它的具体代码:

libobjc.A.dylib

此方法通过

调用
- (BOOL)collisionOccured {
    // Assumption: helicopter is of square shape (collision calculated by radius), walls are rectangles
    // This approach is based on the solution seen here: http://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection/402010#402010

    float helicopterImageWidth = [helicopter texture].contentSize.width;
    float wallImageWidth = [[walls lastObject] texture].contentSize.width;
    float wallImageHeight = [[walls lastObject] texture].contentSize.height;
    float helicopterCollisionRadius = helicopterImageWidth * 0.4f;

    CGPoint helicopterPosition = helicopter.position;


    int numWalls = [walls count];
    for (int i = 0; i < numWalls; i++) {
        CCSprite *wall = [walls objectAtIndex:i];

        if ([wall numberOfRunningActions] == 0) {
            // The wall is not moving, we can skip checking it.
            continue;
        }

        CGPoint wallPosition = wall.position;

        float helicopterDistanceX = abs(helicopterPosition.x - wallPosition.x - wallImageWidth/2);
        float helicopterDistanceY = abs(helicopterPosition.y - wallPosition.y - wallImageHeight/2);

        if (helicopterDistanceX > (wallImageWidth/2 + helicopterCollisionRadius)) { return NO; }
        if (helicopterDistanceY > (wallImageHeight/2 + helicopterCollisionRadius)) { return NO; }

        if (helicopterDistanceX <= (wallImageWidth/2)) { return YES; }
        if (helicopterDistanceY <= (wallImageHeight/2)) { return YES; }

        float cornerDistance_sq = powf((helicopterDistanceX - wallImageWidth/2), 2) + 
                                powf((helicopterDistanceY - wallImageHeight/2), 2);

        return (cornerDistance_sq <= powf(helicopterCollisionRadius, 2));
    }

    // this should not occur
    return NO;
}

问题是更新方法需要- (void)update:(ccTime)delta { if ([self collisionOccured]) { NSLog(@"A collision occured"); } } (时间过去)作为参数,所以我无法逐帧检查发生了什么 - 每当我继续执行时,我会看到一个不同的场景。

(我在代码中使用cocos2d)

2 个答案:

答案 0 :(得分:1)

您可以设置条件断点。略微调整到update:

- (void)update:(ccTime)delta {
     BOOL collided = [self collisionOccured];
     if (collided) {
        NSLog(@"A collision occured");
    }
}

您可以在BOOL分配后(即在if行)正常设置断点,然后右键单击蓝色断点箭头并选择“显示消息气泡”,并且添加collided作为条件。额外变量应该在Release构建模式中进行优化。

答案 1 :(得分:0)

如果您使用的是本地返回变量:

- (BOOL)someMethod {
   BOOL ret = NO;
   if (something) {
      ret = YES;
   } else if (something_else) {
      ret = YES;
   }
   // ... and so on
   return ret;
}

您只需在ret

上设置观察点即可

否则,您可能会坚持使用代码 - 希望条件断点的一些巧妙组合将帮助您不必在每次调用时中断。像使用objc_exception_throw一样设置方法断点是行不通的,因为它会在每次调用时停止,并且在调用站点上打破返回值为时已晚,无法确定如何到达那里。

如果您可以发布代码,我们可以为调试策略提供更具体的帮助。祝好运。 : - )