Ошибка переполнения стека в выпуске, но не отладка. (ActionScript) - PullRequest
0 голосов
/ 08 января 2012

У меня есть код ActionScript3, который по какой-то причине падает только при переполнении стека при компиляции в режиме «Release».Метод, в котором происходит сбой, не вызывает никакой другой функции и, следовательно, не рекурсивно.Странно то, что при компиляции в режиме «Отладка» он работает отлично.Режим 'Release' также начинает работать, если я включаю 'Verbose stack traces' в опциях компилятора.Что это за обман?Есть ли ошибка во флеш-компиляторе, когда он пытается оптимизировать слишком много?


Редактировать:

Вот трассировка стека:

Stacktrace:
VerifyError: Error #1023: Stack overflow occurred.

    at Extensions::CRunObjectSelection/filterNonQualifierObjects()
    at Extensions::CRunObjectSelection/filterObjects()
    at Extensions::CRunEasing/con_IsObjectMoving()
    at Extensions::CRunEasing/condition()
    at Objects::CExtension/condition()
    at Conditions::CCndExtension/eva2()
    at Conditions::CCndExtension/eva1()
    at Events::CEventProgram/computeEventList()
    at RunLoop::CRun/f_GameLoop()
    at RunLoop::CRun/doRunLoop()
    at Application::CRunApp/loopFrame()
    at Application::CRunApp/playApplication()
    at Application::CRunApp/stepApplication()

А здесьчасть кода, указанного в этом отчете:

public function selectAll(Oi:int):void
{
    var pObjectInfo:CObjInfo = OiList[Oi];
    pObjectInfo.oilNumOfSelected = pObjectInfo.oilNObjects;
    pObjectInfo.oilListSelected = pObjectInfo.oilObject;
    pObjectInfo.oilEventCount = eventProgram.rh2EventCount;

    var i:int = pObjectInfo.oilObject;
    while(i >= 0)
    {
        var pObject:CObject = ObjectList[i];
        pObject.hoNextSelected = pObject.hoNumNext;
        i = pObject.hoNumNext;
    }
}

public function filterNonQualifierObjects(rdPtr:Object, Oi:int, negate:Boolean, filter:Function):Boolean
{
    var pObjectInfo:CObjInfo = OiList[Oi];
    var hasSelected:Boolean;
    if (pObjectInfo.oilEventCount != eventProgram.rh2EventCount){
        selectAll(Oi);  //The SOL is invalid, must reset.
    }

    //If SOL is empty
    if(pObjectInfo.oilNumOfSelected <= 0){
        return false;
    }

    var firstSelected:int = -1;
    var count:int = 0;
    var current:int = pObjectInfo.oilListSelected;
    var previous:CObject = null;

    while(current >= 0)
    {
        var pObject:CObject = ObjectList[current];
        var filterResult:Boolean = filter(rdPtr, pObject);
        var useObject:Boolean = Boolean(int(filterResult) ^ int(negate));
        hasSelected = Boolean(int(hasSelected) | int(useObject));

        if(useObject)
        {
            if(firstSelected == -1){
                firstSelected = current;
            }

            if(previous != null){
                previous.hoNextSelected = current;
            }

            previous = pObject;
            count++;
        }
        current = pObject.hoNextSelected;
    }
    if(previous != null){
        previous.hoNextSelected = -1;
    }

    pObjectInfo.oilListSelected = firstSelected;
    pObjectInfo.oilNumOfSelected = count;

    return hasSelected;
}

Ответы [ 2 ]

1 голос
/ 23 марта 2012
1 голос
/ 08 января 2012

Используете ли вы трассировку где-нибудь в вашем коде?Есть две возможные проблемы с функцией трассировки.Во-первых, трассировка создает задержку во время выполнения и влияет на асинхронные процессы.Во-вторых, возможно, что некоторые функции вызываются в функции trace.Эти методы могут изменять значения переменных.

Таким образом, вы можете удалить некоторые следы и проверить сбой кода в режиме выпуска.

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