Jquery 零星铬aw捕捉屏幕

Jquery 零星铬aw捕捉屏幕,jquery,asp.net-mvc,google-chrome,knockout.js,Jquery,Asp.net Mvc,Google Chrome,Knockout.js,我们正在开发一个asp.net mvc 3应用程序,该应用程序在javascript计时器上轮询服务器以获取数据。当返回数据时,我们使用jquery1.7.1和knockout 2.0显示它。视图是一个小部件,显示一些带有文本和图标的通知div 当我们将计时器间隔加速到5秒并返回大量通知时,就会出现问题。经过一段随机时间后,我们会看到chrome“Aw Snap”页面出现。让计时器计时3分钟到30分钟之间。请注意,我们的应用程序需要全天候在浏览器中打开,这就是我们进行长期测试的原因 经过研究,除

我们正在开发一个asp.net mvc 3应用程序,该应用程序在javascript计时器上轮询服务器以获取数据。当返回数据时,我们使用jquery1.7.1和knockout 2.0显示它。视图是一个小部件,显示一些带有文本和图标的通知div

当我们将计时器间隔加速到5秒并返回大量通知时,就会出现问题。经过一段随机时间后,我们会看到chrome“Aw Snap”页面出现。让计时器计时3分钟到30分钟之间。请注意,我们的应用程序需要全天候在浏览器中打开,这就是我们进行长期测试的原因

经过研究,除了查看google chromes日志,似乎没有其他方法可以诊断“Aw快照”页面。我们试着使用Sawbuck进行详细的日志记录,当“Aw Snap”页面出现时,它不会显示任何异常

我们正在从dom中删除元素,注释代码,删除css样式,尝试我们能想到的一切来弄清这一点。所有这些都失败了

有人知道下一步该怎么做吗?是什么导致了chrome Aw快照页面?这可能是一个javascript调用,还是可能是由于dom操作造成的?任何帮助都将不胜感激

更新:

当我们在windbg中加载转储文件(注释中提到)时,我们得到了异常发生的调用堆栈。运行.ecxr命令后,我们得到: .ecxr命令:0:000>.ecxr eax=1a300000 ebx=1ef4fb04 ecx=17323425 edx=3dd5ee49 esi=1ef4faed edi=17323425 eip=17b12d23 esp=0044eab0 ebp=0044eac0 iopl=0 nv up ei pl nz na pe nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206 17b12d23测试字节ptr[eax+0Ch],4 ds:002b:1a30000c=?? 调用堆栈: 警告:帧IP不在任何已知模块中。下面的框架可能是错误的。 0x17b12d23 0x15dcf8ea 0x2d47cdae 0x15dcfae5 0x275a46ca 0x2d47cdae 0x2d4a2943 0x15d0de61 0x275a3606 0x275a355d 0x15d0de61 0x2d4556b6 0x15d0de61 0x15d2345c 0x1fc6d613 0x1fc6e5a9 铬1150000!v8::internal::Invoke+0xed[c:\b\build\slave\chrome-official\build\src\v8\src\execution.cc@118] 铬1150000!std::_Tree>*,std::less,std::分配器>*>>,0>>::查找+0x2f[c:\program files(x86)\microsoft visual studio 9.0\vc\include\xtree@982] 铬1150000!v8::Function::Call+0x12e[c:\b\build\slave\chrome-official\build\src\v8\src\api.cc@3604] 铬1150000!WebCore::V8Proxy::instrumentedCallFunction+0x13d[c:\b\build\slave\chrome official\build\src\third\U party\webkit\source\WebCore\bindings\v8\V8Proxy.cpp@432]

更新#2: 根据ericb的要求:

定时器功能:

$.ajax({
        url: aUpdateUrl,
        type: 'post',
        success: function (aData) {
            try {
                if (self.IsAutoUpdating) {
                    self.OnBeforeDataUpdated();
                    self.Data(aData);
                    self._setUpdateTime();
                    self.DataRefreshed = true;
                    self._applyAutoSizing();
                }
            }
            catch (error) {
                self.Widget.HandleError(error);
            }
        },
        complete: function () {
            self.Widget.Loaded = true;
            if (self.IsAutoUpdating) {
                self.AutoUpdateTimer = setTimeout(function () {
                    self.StartAutoUpdate(self.AutoUpdateUrl);
                }, self.UpdateInterval);
            }
        }
    });
我们的完整函数将在self.UpdateInterval时间中再次调用计时器,该时间在我们的测试中设置为5秒

此外,以下是html以及如何将其连接到knockout:

<div id="notifications-@Model.Key" class="notification-items">

<ul data-bind="foreach: { data: Dashboard.WidgetLayer@(Model.Key).NotificationModel.notificationsToShow,
    afterRemove: Dashboard.WidgetLayer@(Model.Key).NotificationModel.hideNotificationElement,
    afterAdd: Dashboard.WidgetLayer@(Model.Key).NotificationModel.showNotificationElement }">
    <li class="notification-item group" data-bind="click: Dashboard.WidgetLayer@(Model.Key).NotificationModel.onNotificationClick">
        <div>
            <img class="notification-icon" data-bind="attr: {src: Spec.Icon}" alt="icon"></img>
        </div>
        <div class="notification-content group">
            <div class="notification-header">
                <div class="title">
                    <span class="subject-name" data-bind='text: SubjectTitle'></span>:&nbsp;<span class="spec-title" data-bind='text: Spec.Title'></span>
                </div>
                <button class="acknowledge-notification" data-bind="click: Dashboard.WidgetLayer@(Model.Key).NotificationModel.acknowledgeNotification, clickBubble: false"></button>
                <div class="time-since-event" data-bind='text: FormattedTimestamp'></div>
            </div>
            <div>
                <div class="spacer"></div>
                <div class="details action-details" data-bind='text: Details'> </div>
            </div>
        </div>
    </li>
</ul>
更新通知列表的其余javascript代码基于knockoutjs的动画转换实例,如下所示:


如果需要的话,我可以提供相应的代码,但它有150行,为了简洁起见,我决定将其排除在外。

也许您需要看看不同的轮询技术。根据您有多少用户,我建议查看Signal:

我最近做了一个关于如何将signalr和knockoutjs集成在一起的演讲

幻灯片和示例:


代码:

也许您想看看不同的轮询技术。根据您有多少用户,我建议查看Signal:

我最近做了一个关于如何将signalr和knockoutjs集成在一起的演讲

幻灯片和示例:


代码:

原因可能是优化引擎

我也遇到过类似的问题,我能够将其与V8优化引擎导致的Aw Snap碰撞隔离开来。我有一个大约2400行的大功能,可以反复运行。在第300次左右调用该函数后(根据其他看似无关的更改,该数字变化很大),优化引擎将启动,Windows任务管理器将显示RAM使用量的巨大峰值,这将导致选项卡上出现“Aw Snap”

事实证明,Chrome可以使用标志--js flags=“--allow natives syntax”启动,然后使用本机V8 javascript命令
%NeverOptimizeFunction(functionName)
可用于阻止Chrome尝试运行其优化器


正如可以想象的,这不是最容易追踪的bug,所以我只是把它作为另一件事情的建议,作为可怕的“AW SNAP”的一个潜在原因。

< p>原因可能是优化引擎。

我也遇到过类似的问题,我能够将其与V8优化引擎导致的Aw Snap碰撞隔离开来。我有一个大约2400行的大功能,可以反复运行。在第300次左右调用该函数后(根据其他看似无关的更改,该数字变化很大),优化引擎将启动,Windows任务管理器将显示RAM使用量的巨大峰值,这将导致选项卡上出现“Aw Snap”

事实证明,Chrome可以使用标志--js flags=“--allow natives syntax”启动,然后使用本机V8 javascript命令
%NeverOptimizeFunction(functionName)
可用于阻止Chrome尝试运行其优化器


正如可以想象的,这不是最容易追踪的bug,所以我只是把它作为另一件事情的建议,作为可怕的“AWAP”的一个潜在原因。在进行测试时,我们使用perfmon监控chrome和web开发过程。“Aw Snap”页面之前没有内存增长。我们只是收到一条输出消息

$('#notifications-@Model.Key .notification-item').live({
        mouseenter:
            function() {
                var lElement = this;
                $(lElement).find('.time-since-event').stop(true, true).fadeOut(0, function (){$('.acknowledge-notification', lElement).fadeIn(2000);});

            },
        mouseleave:
            function() {
                var lElement = this;
                $(lElement).find('.acknowledge-notification').stop(true, true).fadeOut(0, function (){$('.time-since-event', lElement).fadeIn(1000);});
            }
    });