零星的镀铬aw扣屏幕

时间:2012-04-18 12:58:48

标签: jquery asp.net-mvc google-chrome knockout.js

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

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

经过研究,似乎没有办法诊断“Aw Snap”页面,除了查看谷歌chromes日志记录。我们尝试使用Sawbuck进行详细记录,当出现“Aw Snap”页面时,没有显示任何异常。

我们正在从dom中删除元素,注释掉代码,删除css样式,尝试我们能想到的所有内容以达到最底层。所有这些都失败了。

有谁知道下一步要做的是什么?什么导致镀铬Aw Snap页面?它可能是一个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     chrome_1150000!v8 :: internal :: Invoke + 0xed [c:\ b \ build \ slave \ chrome-official \ build \ src \ v8 \ src \ execution.cc @ 118]     chrome_1150000!std :: _ Tree> *,std :: less,std :: allocator> * GT; >,0> > :: find + 0x2f [c:\ program files(x86)\ microsoft visual studio 9.0 \ vc \ include \ xtree @ 982]     chrome_1150000!v8 :: Function :: Call + 0x12e [c:\ b \ build \ slave \ chrome-official \ build \ src \ v8 \ src \ api.cc @ 3604]     chrome_1150000!WebCore :: V8Proxy :: instrumentedCallFunction + 0x13d [c:\ b \ build \ slave \ chrome-official \ build \ src \ third_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以及我们如何将它连接到淘汰赛上:

<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>

我们还在通知div上设置了jquery live with fade in / fade out如下:

$('#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);});
            }
    });

更新通知列表的其余javascript代码基于knockoutjs的动画过渡实时示例: http://knockoutjs.com/examples/animatedTransitions.html

如果需要,我可以提供代码,但它是150行,并决定将其排除在外。

2 个答案:

答案 0 :(得分:1)

也许你可能想看看不同的轮询技术。根据您拥有的用户数量,我建议您查看Signalr:

https://github.com/SignalR/SignalR

我最近就如何将signalr和knockoutjs集成在一起进行了讨论。

幻灯片和示例:http://bit.ly/FamilyFeudSlides

代码:https://github.com/jasonmore/familyfeud

答案 1 :(得分:0)

原因可能是优化引擎。

我遇到了类似的问题,我能够将它隔离到由V8优化引擎引起的Aw Snap崩溃。我有一个大约2400行的功能,反复运行。在大约300次调用函数之后(根据其他看似无关的变化,数量变化很大),优化引擎会启动,Windows任务管理器会显示RAM使用量的大幅增加,这将导致“Aw” “在选项卡上捕捉。

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

可以想象,这不是最容易追踪的错误,因此我只是将其作为另一件事的建议考虑作为可怕的“Aw Snap”的潜在原因。