2012-01-07 38 views
-1

我有一些ActionScript3代碼出於某種原因在編譯爲「發佈」模式時僅在堆棧溢出時崩潰。它崩潰的方法不會調用任何其他函數,因此不會以任何方式遞歸。 奇怪的是,當在'調試'模式編譯它完美的作品。 如果我在編譯器選項中啓用'詳細堆棧跟蹤','釋放'模式也開始工作。這是什麼詭計?閃存編譯器在嘗試優化太多時是否存在缺陷?發佈時堆棧溢出錯誤,但未調試。 (動作腳本)


編輯:

這裏是堆棧跟蹤:

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

漂亮很難說,不知道你的代碼什麼... – weltraumpirat 2012-01-07 22:08:26

+2

這種情況出現,請分享代碼的一部分。 – Diode 2012-01-08 02:41:46

+3

同上,但它也可能有助於發佈堆棧跟蹤或完整的錯誤消息。你正在描述一個非常普遍的情況,出現了一些錯誤。我還會介紹如何查看調試(在Flash?FB?一個網頁?)以及您如何查看該版本。 – iND 2012-01-08 06:51:03

回答

1

你使用跟蹤任何地方在你的代碼?跟蹤功能有兩個可能的問題。起初,跟蹤會延遲運行時間並影響異步進程。其次,有可能在跟蹤函數中調用某些方法。這個方法可以改變變量的值。

因此,您可以刪除一些痕跡並檢查代碼是否會在發佈模式下崩潰。

+0

我不在代碼中的任何地方使用跟蹤。我在原帖中發表了評論中的代碼。 – Andos 2012-01-08 17:21:07