Jquery 零星铬aw捕捉屏幕
我们正在开发一个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的要求: 定时器功能: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分钟之间。请注意,我们的应用程序需要全天候在浏览器中打开,这就是我们进行长期测试的原因 经过研究,除
$.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>: <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);});
}
});