js导致firefox崩溃

时间:2013-04-17 00:21:14

标签: javascript firefox crash

我为这个模糊的问题道歉,但我不知道如何更好地描述正在发生的事情。

我正在开发一个到目前为止严格用js编码的网络应用程序(还没有服务器端代码)。我正在使用HTML 5画布绘制一种布局图,其中包含点击事件和颜色编码以及选择对象等。

我正在严格开发这个用于Firefox(我正在使用moz特定的CSS和存储,我必须使用的IE版本不支持。)

今天在处理我的项目时,我开始遇到奇怪的行为。当加载网页时,会出现一些内容(按钮,div等),然后Firefox会弹出一个对话框,说明“Firefox已停止工作”并询问我是否要“在线检查解决方案并关闭程序”或只是“关闭程序”。以下内容位于“更多详细信息”窗格中:

> Problem signature:   Problem Event Name:  APPCRASH   Application
> Name: firefox.exe   Application Version:  17.0.4.4814   Application
> Timestamp:    5138e84f   Fault Module Name:   mozjs.dll   Fault Module
> Version:  0.0.0.0   Fault Module Timestamp:   5138d295   Exception
> Code: c0000005   Exception Offset:    0002171f   OS
> Version:  6.1.7601.2.1.0.256.4   Locale ID:   1033   Additional
> Information 1:    0a9e   Additional Information
> 2:    0a9e372d3b4ad19135b953a78882e789   Additional Information 3:    0a9e  
> Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
> 
> Read our privacy statement online:  
> http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409

If the online privacy statement is not available, please read our privacy statement offline:
  C:\Windows\system32\en-US\erofflps.txt

我在代码中添加了一些警告语句,并将问题追溯到某个代码块。但是,如果我单步执行该块(在for循环的每次迭代中放置一个警告语句),代码将按预期执行,并且Firefox不会崩溃。 Firebug也没有看到代码有任何问题。如果我取消警报,那么Firefox会再次窒息。

如果我将代码部分打破并通过单击按钮运行它,那么代码也会正常执行,但是我的用户必须单击按钮才能使其正常工作。

我需要帮助弄清楚我应该尝试解决问题。

可能(我不知道)的一些事情是相关的:

我从大约12个不同的xml文档加载数据,一个大到600KB,其余大约20KB。

我正在导入15个不同的js库 - 我可以减少这个数量,但是这些文件中的功能在逻辑上被打破了,所以如果我必须连接它们会使它更难开发全部一起。

我没有使用jQuery或MooTools或任何其他类似的库。

关于如何解决正在发生的事情的任何想法?

修改

这是它死掉的函数的代码。我没有发布实际代码的原因是因为,正如我所说,代码本身在不与页面的其余代码一起运行时正确执行。不过,如果有帮助的话,就在这里。

function GetSeatPaths(Seats){
    // fills the SeatPath, ArmrestPath and SimpleSeatPath for the seat instance (used for cango drawing)

    for (var i =0; i<Seats.length; i++){
        var ThisSeat = Seats[i];

        var SeatPath = ThisSeat.SeatPath;

        //alert("SeatCollection.prototype.GetSeatPaths: " + i);

        if (typeof(SeatPath) === "undefined" || SeatPath == null){

            var Column = ThisSeat.Column;
            var Dims = ThisSeat.Dims;

            if (Column != "Left"){
                BL = -1;
            } else {
                BL = 1;
            }

            var SeatRad = 2;

            try{
                var seat_pax = parseInt(Dims.Seat_PAX); 
            } catch(err){
                var seat_pax = 3;
            }

            if (isNaN(seat_pax)){
                var seat_pax = 3;
            }

            //Make an armrest and cushion set var SeatRad = 2; //this is the radius of the seat cushions
            //alert("getSeatPaths");



            var CTS = 2.25;
            var TAR = 16;
            var CRP = 16.2;
            var BA = 18;
            var FOA = -2;
            var SBT2 = 23.2;
            var ACO = 45;

            if (Dims.hasOwnProperty('CTS')){
                CTS = parseFloat(Dims.CTS.Value);
            } 

            if (Dims.hasOwnProperty('TAR')){
                TAR = parseFloat(Dims.TAR.Value);
            } 

            if (Dims.hasOwnProperty('CRP')){
                CRP = parseFloat(Dims.CRP.Value);
            } 

            if (Dims.hasOwnProperty('BA')){
                BA = parseFloat(Dims.BA.Value);
            } 

            if (Dims.hasOwnProperty('FOA')){
                FOA = parseFloat(Dims.FOA.Value);
            } 

            if (Dims.hasOwnProperty('SBT2')){
                SBT2 = parseFloat(Dims.SBT2.Value);
            } 

            if (Dims.hasOwnProperty('ACO')){
                ACO = parseFloat(Dims.ACO.Value);
            } 

            SeatGeometryArr = [];
            ArmrestGeometryArr = [];

            var SeatOffset = 0
            for (var j=0; j<seat_pax; j++){
                var CW = 17;
                var q = 4;

                if (Dims.hasOwnProperty('CW' + (j+1))){
                    CW = parseFloat(Dims['CW' + (j+1)].Value);
                }

                if (Dims.hasOwnProperty('q' + (j+1))){
                    CW = parseFloat(Dims['q' + (j+1)].Value);
                }

                SeatGeometryArr.push(['M',-CTS+SeatRad,-TAR+q/2 + SeatOffset]);
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,-CTS,-TAR+q/2+SeatRad + SeatOffset]);
                SeatGeometryArr.push(['L',-CTS,-TAR+q/2+CW-q/2-SeatRad + q/2 + SeatOffset]);
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,-CTS+SeatRad,-TAR+CW+q/2 + SeatOffset]);
                SeatGeometryArr.push(['L',CRP-SeatRad, -TAR+q/2+CW + SeatOffset]);
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,CRP, -TAR+q/2+CW-SeatRad + SeatOffset]);
                SeatGeometryArr.push(['L',CRP, -TAR+q/2+SeatRad + SeatOffset]);
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,CRP-SeatRad, -TAR+q/2 + SeatOffset]);
                SeatGeometryArr.push(['L',-CTS+SeatRad,-TAR+q/2 + SeatOffset]);
                SeatGeometryArr.push(['Z']);

                SeatGeometryArr.push(['M',CRP+SeatRad,-TAR+q/2 + SeatOffset]); 
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,CRP,-TAR+q/2+SeatRad + SeatOffset]);
                SeatGeometryArr.push(['L',CRP,-TAR+q/2+CW-SeatRad + SeatOffset]);
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1, CRP+SeatRad, -TAR+q/2+CW + SeatOffset]);
                SeatGeometryArr.push(['L',SBT2 - SeatRad ,-TAR+q/2+CW + SeatOffset]);
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1, SBT2, -TAR + q/2 + CW - SeatRad + SeatOffset]);
                SeatGeometryArr.push(['L',SBT2,-TAR + q/2 + SeatRad+ SeatOffset]);
                SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1, SBT2 - SeatRad,-TAR+q/2 + SeatOffset]);
                SeatGeometryArr.push(['L',CRP+SeatRad,-TAR+q/2 + SeatOffset]);
                SeatGeometryArr.push(['Z']);
                SeatOffset += CW;
            }
            //alert("Out of Cushions");
            var SeatPath = FlipGeoArr(SeatGeometryArr,-BL); // Note: BL is flipped here because the geometry for the seat is defined for a RH seat

            // Create Armrest Geometry
            ArmrestGeometryArr = [];
            SeatOffset = 0
            for (var j=0; j<seat_pax+1; j++){
                var CW = 17;
                var q = 4;

                if (Dims.hasOwnProperty('CW' + (j+1))){
                    CW = parseFloat(Dims['CW' + (j+1)].Value);
                }

                if (Dims.hasOwnProperty('q' + (j+1))){
                    CW = parseFloat(Dims['q' + (j+1)].Value);
                }

                ArmrestGeometryArr.push(['M',-FOA,-TAR + SeatOffset]);
                ArmrestGeometryArr.push(['L',-FOA,-TAR+q + SeatOffset]);
                ArmrestGeometryArr.push(['L',BA,-TAR+q + SeatOffset]);
                ArmrestGeometryArr.push(['L',BA,-TAR + SeatOffset]);
                ArmrestGeometryArr.push(['L',-FOA,-TAR + SeatOffset]);
                ArmrestGeometryArr.push(['Z']);
                SeatOffset += CW;
            }
            //alert("Out of Armrests");
            var ArmrestPath = FlipGeoArr(ArmrestGeometryArr,-BL); // Note: BL is flipped here because the geometry for the seat is defined for a RH seat

            //alert("Into Simple");
            // create geometry for the simplified seat
            SimpleSeatGeometryArr = [];
            SimpleSeatGeometryArr.push(['M',-CTS,-TAR]);
            SimpleSeatGeometryArr.push(['L',-CTS,ACO]);
            SimpleSeatGeometryArr.push(['L',SBT2,ACO]);
            SimpleSeatGeometryArr.push(['L',SBT2,-TAR]);
            SimpleSeatGeometryArr.push(['Z']);
            //alert("Out of Simple");
            var SimpleSeatPath = FlipGeoArr(SimpleSeatGeometryArr,-BL); // Note: BL is flipped here because the geometry for the seat is defined for a RH seat

            // stick these values in for all seat instances with this part number
            for (var j=0; j<Seats.length; j++){
                if (Seats[j].PartNumber == Seats[i].PartNumber){
                    Seats[j].SeatPath = SeatPath;
                    Seats[j].ArmrestPath = ArmrestPath;
                    Seats[j].SimpleSeatPath = SimpleSeatPath;
                }
            }

        }
    }
}

我认为这也可能是一种竞争条件,所以我厌倦了使用window.setTimeout(functionThatBreaks,1)来确保它在加载依赖项时执行,但无济于事。弹出相同的错误,FF死亡。还有什么我可以做的,没有用户互动来尝试确定它是否是竞争条件?

编辑4-17-2013,太平洋标准时间下午2:00 我修改了上面的代码,以显示在lib3d和TheBrain的建议中所做的更改。我也尝试使它成为常规函数而不是对象原型,但行为仍然没有变化。

我也发现了一些奇特的东西。如果我的网站有FireBug活动,它运行正常。如果我禁用FireBug,那么FireFox会崩溃。我现在非常困惑。

编辑4-17-2013 4:05太平洋标准时间 事实证明我错误的FireBug导致了问题。我可以关闭浏览器,通过从我的计算机上的文件夹打开html页面重新打开它,它将失败。除了在Firefox失败对话框中单击“关闭窗口”,然后打开相同的html页面,我突然无法工作。

什么可能导致这种行为?

0 个答案:

没有答案