GDB приостанавливает программу в XCode даже без установленных точек останова - PullRequest
1 голос
/ 07 декабря 2010

Что может вызвать приостановку работы моей программы в Xcode? У меня не установлены точки останова, и когда я выполняю свой код, в командной строке появляется приглашение gdb. У кого-нибудь есть быстрый совет для этого. Сама программа не вылетает и возвращает правильные значения. Это просто не остановит исполнение.

Расскажу немного о том, над чем я работаю. Я выполняю некоторые упражнения из книги Стивена Кочана по программированию в Objective-C 2.0. Упражнение, где это произошло, 8.6. В упражнении предлагается создать простой метод, который создаст объект прямоугольника с пересекающимися данными между двумя другими прямоугольниками.

Моя главная выглядит так:

#import "Rectangle.h"
#import "XYPoint.h"
#import <stdio.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Rectangle *myRectangle = [[Rectangle alloc] init];
    XYPoint *myPoint = [[XYPoint alloc] init];
    Rectangle *secondRectangle = [[Rectangle alloc] init];
    XYPoint *secondPoint = [[XYPoint alloc] init];
    Rectangle *intersectRectangle;

    [myRectangle setWidth:100 andHeight:180];
    [myPoint setX:400 andY:300];
    [myRectangle setOrigin:myPoint];

    [secondRectangle setWidth:250 andHeight:75];
    [secondPoint setX:200 andY:420];
    [secondRectangle setOrigin:secondPoint];

    intersectRectangle = [myRectangle intersect:secondRectangle];

    NSLog(@"Width: %i, Height: %i", intersectRectangle.width, intersectRectangle.height);
    NSLog(@"With translated origin (%i, %i)", intersectRectangle.origin.x, intersectRectangle.origin.y);

    [myRectangle release];
    [myPoint release];
    [secondRectangle release];
    [secondPoint release];
    [intersectRectangle release];
    [pool drain];
    return 0;
}

И метод для класса, подобный следующему:

-(Rectangle *)intersect:(Rectangle *)rect{
    if (intersectingRect) {
        [intersectingRect release];
    }
    intersectingRect = [[Rectangle alloc] init];
    XYPoint *intersectPt = [[XYPoint alloc] init];
    int intersectWidth = 0;
    int intersectHeight = 0;
    int intersectX = 0;
    int intersectY = 0;

    if(origin.x < rect.origin.x) {
        if ((origin.x + width) > rect.origin.x) {
            if ((origin.x + width) > (rect.origin.x+rect.height)) {
                if (origin.y < rect.origin.y) {
                    if ((origin.y+height) > rect.origin.y) {
                        if ((origin.y + height) > (rect.origin.y + rect.height)) {
                            intersectWidth = rect.width;
                            intersectHeight = rect.height;
                            intersectX = rect.origin.x;
                            intersectY = rect.origin.y;
                        } else {
                            intersectWidth = rect.width;
                            intersectHeight = origin.y + height - rect.origin.y;
                            intersectX = rect.origin.x;
                            intersectY = rect.origin.y;
                        }
                    } else {
                        intersectWidth = 0;
                        intersectHeight = 0;
                        intersectX = 0;
                        intersectY = 0;
                    }
                } else if ((rect.origin.y + rect.height) > origin.y) {
                    if ((rect.origin.y + rect.height) > (origin.y + height)) {
                        intersectWidth = rect.width;
                        intersectHeight = height;
                        intersectX = rect.origin.x;
                        intersectY = origin.y;
                    } else {
                        intersectWidth = rect.width;
                        intersectHeight = rect.origin.y + rect.height - origin.y;
                        intersectX = rect.origin.x;
                        intersectY = origin.y;
                    }
                } else {
                    intersectWidth = 0;
                    intersectHeight = 0;
                    intersectX = 0;
                    intersectY = 0;
                }
            } else if (origin.y < rect.origin.y) {
                if ((origin.y + height) > rect.origin.y) {
                    if ((origin.y + height) > (rect.origin.y + rect.height)) {
                        intersectWidth = origin.x + width - rect.origin.x;
                        intersectHeight = rect.height;
                        intersectX = rect.origin.x;
                        intersectY = rect.origin.y;
                    } else {
                        intersectWidth = origin.x + width - rect.origin.x;
                        intersectHeight = origin.y + height - rect.origin.y;
                        intersectX = rect.origin.x;
                        intersectY = rect.origin.y;
                    }
                } else {
                    intersectWidth = 0;
                    intersectHeight = 0;
                    intersectX = 0;
                    intersectY = 0;
                }
            } else if ((rect.origin.y + rect.height) > origin.y) {
                if ((rect.origin.y + rect.height) < (origin.y + height)) {
                    intersectWidth = origin.x + width - rect.origin.x;
                    intersectHeight = rect.origin.y + rect.height - origin.y;
                    intersectX = rect.origin.x;
                    intersectY = origin.y;
                } else {
                    intersectWidth = origin.x + width - rect.origin.x;
                    intersectHeight = height;
                    intersectX = rect.origin.x;
                    intersectY = origin.y;
                }
            } else {
                intersectWidth = 0;
                intersectHeight = 0;
                intersectX = 0;
                intersectY = 0;
            }
        } else {
            intersectWidth = 0;
            intersectHeight =0;
            intersectX = 0;
            intersectY = 0;
        }
    } else if (origin.x < (rect.origin.x + rect.width)) {
        if ((origin.x + width) > (rect.origin.x + rect.width)) {
            if (origin.y < rect.origin.y) {
                if ((origin.y+height) > rect.origin.y) {
                    if ((origin.y + height) > (rect.origin.y + rect.height)) {
                        intersectWidth = rect.origin.x + rect.width - origin.x;
                        intersectHeight = rect.height;
                        intersectX = origin.x;
                        intersectY = rect.origin.y;
                    } else {
                        intersectWidth = rect.origin.x + rect.width - origin.x;
                        intersectHeight = origin.y + height - rect.origin.y;
                        intersectX = origin.x;
                        intersectY = rect.origin.y;
                    }
                } else {
                    intersectWidth = 0;
                    intersectHeight = 0;
                    intersectX = 0;
                    intersectY = 0;
                }
            } else if (origin.y < (rect.origin.y + rect.height)) {
                if ((origin.y + height) > (rect.origin.y + rect.height)) {
                    intersectWidth = rect.origin.x + rect.width - origin.x;
                    intersectHeight = rect.origin.y + rect.height - origin.y;
                    intersectX = origin.x;
                    intersectY = origin.y;
                } else {
                    intersectWidth = rect.origin.x + rect.width - origin.x;
                    intersectHeight = height;
                    intersectX = origin.x;
                    intersectY = origin.y;
                }
            } else {
                intersectWidth = 0;
                intersectHeight = 0;
                intersectX = 0;
                intersectY = 0;
            }
        } else if (origin.y < rect.origin.y) {
            if ((origin.y + height) > rect.origin.y) {
                if ((origin.y + height) > (rect.origin.y + rect.height)) {
                    intersectWidth = width;
                    intersectHeight = rect.height;
                    intersectX = origin.x;
                    intersectY = rect.origin.y;
                } else {
                    intersectWidth = width;
                    intersectHeight = origin.y + height - rect.origin.y;
                    intersectX = origin.x;
                    intersectY = rect.origin.y;
                }
            } else {
                intersectWidth = 0;
                intersectHeight = 0;
                intersectX = 0;
                intersectY = 0;
            }
        } else if (origin.y < (rect.origin.y + rect.height)) {
            if ((origin.y + height) > (rect.origin.y + rect.height)) {
                intersectWidth = width;
                intersectHeight = rect.origin.y + rect.height - origin.y;
                intersectX = origin.x;
                intersectY = origin.y;
            } else {
                intersectWidth = width;
                intersectHeight = height;
                intersectX = origin.x;
                intersectY = origin.y;
            }
        } else {
            intersectWidth = 0;
            intersectHeight = 0;
            intersectX = 0;
            intersectY = 0;
        }
    } else {
        intersectWidth = 0;
        intersectHeight = 0;
        intersectX = 0;
        intersectY = 0;
    }
    [intersectingRect setWidth:intersectWidth andHeight:intersectHeight];
    [intersectPt setX:intersectX andY:intersectY];
    [intersectingRect setOrigin:intersectPt];
    return intersectingRect;
}

Дело в том, что я не хочу вообще отключать точки останова. Я просто не понимаю, почему в этом случае выполнение приостанавливается, поскольку я не устанавливаю никаких точек останова. Я не хочу отключать контрольные точки, потому что в конечном итоге я бы хотел их использовать. Именно этот конкретный случай неожиданно приостанавливается.

Ответы [ 2 ]

2 голосов
/ 07 декабря 2010

Программа по какой-то причине пыталась отправить сообщение объекту, который уже был освобожден.Устранение перегрузки метода dealloc решило проблему паузы.Объект, который был создан внутри пересекающегося метода, затем был освобожден перегруженным методом dealloc.Следовательно, когда основной сервер попытался отправить сообщение, чтобы освободить его, оно уже исчезло.

0 голосов
/ 07 декабря 2010

Редактировать : В вашем вопросе не было кода, когда я отвечал, так что, похоже, это не проблема. Я оставлю это здесь на случай, если у кого-то возникнет та же проблема с паузой.


Действительно ли она приостановлена, я имею в виду, доступна ли кнопка Продолжить и имеет зеленый цвет?

Если нет, но выполнение, кажется, остановилось - ваш код, похоже, не работает, но на самом деле он не приостановлен - тогда возможно, что приложение находится в цикле выполнения, ожидая ввода, но вы на самом деле не готов к этому, и кажется, что он повешен.

Если это так, то это может быть похоже на то, что случилось со мной, когда я вызвал что-то с протоколом делегата, но я не стал устанавливать self в качестве делегата, чтобы поток программы никогда не возвращался к ожидаемому. метод делегата.

В любом случае, стоит взглянуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...