2012-04-18 2 views
1

Мы разрабатываем приложение asp.net mvc 3, которое опроса сервера на таймер javascript для данных. Когда данные возвращаются, мы показываем их с помощью jquery 1.7.1 и нокаутом 2.0. Представление представляет собой виджет, отображающий некоторое количество уведомлений с текстом и значком.Sporadic chrome aw snap screen

Когда мы ускоряем наш интервал таймера до 5 секунд и возвращаем большое количество уведомлений, возникает проблема. После случайного времени мы получаем хромированную страницу «Aw Snap». В любом месте от 3 минут до 30 минут отпускания таймера. Обратите внимание, что наше приложение необходимо открыть в браузере 24/7, поэтому мы прошли долгосрочное тестирование.

После исследования кажется, что нет возможности диагностировать страницу «Aw Snap», кроме того, что вы смотрите на регистрацию хромов google. Мы попытались использовать Sawbuck с подробным протоколированием, на котором не отображалось ничего необычного, когда появляется страница «Aw Snap».

Мы находимся в пункте удаления элементов из dom, комментируя код, удаляя стиль css, пробуя все, что мы можем придумать, чтобы разобраться в этом. Все это не удалось.

Кто-нибудь знает, какой хороший следующий шаг? Что вызывает хром Aw Snap-страницы? Может быть, это вызов javascript или, вероятно, из-за манипуляции с dom? Любая помощь будет принята с благодарностью.

Update:

Когда мы загрузить файл дампа (упомянутый в комментариях) в WinDbg мы получаем этот стек вызовов, где произошло исключение. После запуска команды .ecxr мы получаем: .ecxr команды: 0: 000> .ecxr EAX = 1a300000 EBX = 1ef4fb04 ECX = 17323425 EDX = 3dd5ee49 еси = 1ef4faed еди = 17323425 EIP = 17b12d23 особ = 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 :: внутренний :: Invoke + 0xed [с: \ Ь \ build \ slave \ chrome-official \ build \ src \ v8 \ src \ execution.cc @ 118] chrome_1150000! std :: _ Tree> *, std :: less, std :: allocator> *>>, 0>>: : find + 0x2f [c: \ program files (x86) \ microsoft visual studio 9.0 \ vc \ include \ xtree @ 982] chrome_1150000! v8 :: Функция :: 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]

Update # 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.UpdateInter вал, который был установлен на 5 секунд для нашего тестирования.

Кроме того, здесь HTML и как мы его подключили к нокаут:

<div id="[email protected]" class="notification-items"> 

<ul data-bind="foreach: { data: [email protected](Model.Key).NotificationModel.notificationsToShow, 
    afterRemove: [email protected](Model.Key).NotificationModel.hideNotificationElement, 
    afterAdd: [email protected](Model.Key).NotificationModel.showNotificationElement }"> 
    <li class="notification-item group" data-bind="click: [email protected](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: [email protected](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> 

У нас также есть JQuery жить настроить на уведомления дивы с/проявки следующим образом :

$('#[email protected] .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);}); 
      } 
    }); 

остальная часть яваскрипта кода, который обновляет список уведомлений основано на живом примере knockoutjs игровых анимированных переходов доступны здесь: http://knockoutjs.com/examples/animatedTransitions.html

Я могу предоставить код для этого, если необходимо, но это 150 строк и решил исключить его для краткости.

+0

Что-то еще я должен упомянуть. Мы использовали perfmon для контроля процессов chrome и web dev при проведении наших тестов. Не было роста памяти до страниц «Aw Snap». – Adam

+0

Мы только что получили выходное сообщение в Sawbuck о создании файла дампа. Это сообщение выводилось сразу после появления страницы «Aw Snap». Вот ссылка на файл дампа, если это может помочь. http://www.filedropper.com/chrome-last – Adam

+0

Вы могли бы показать некоторую версию кода таймера, который вы реализовали, и/или, возможно, поместить это в jsfiddle и посмотреть, можно ли его реплицировать? – ericb

ответ

1

Возможно, вам, возможно, захочется взглянуть на различные технологии опроса. В зависимости от того, сколько пользователей у вас есть, я предлагаю смотреть на Signalr:

https://github.com/SignalR/SignalR

Недавно я выступил с докладом о том, как интегрировать signalr и knockoutjs вместе.

Слайды и примеры: http://bit.ly/FamilyFeudSlides

Код: https://github.com/jasonmore/familyfeud

+0

Положу это в крайнем случае.Спасибо за информацию – Adam

0

Причиной может быть оптимизирующий двигатель.

У меня возникали подобные проблемы, и я смог изолировать его от аварии Aw Snap, вызванной двигателем оптимизации V8. У меня была большая функция ~ 2400 строк, которые неоднократно запускались. После 300-го или около того вызова функции (число варьировалось довольно немного в зависимости от других, казалось бы, несвязанных изменений), оптимизирующий движок мог бы взорваться, а диспетчер задач Windows продемонстрировал бы огромный всплеск в использовании ОЗУ, который привел бы к «Aw Snap "на вкладке.

Оказалось, что Chrome можно запустить с флагом -js-flags = "- allow-natives-syntax", а затем встроенная команда V8 javascript %NeverOptimizeFunction(functionName); может использоваться для предотвращения попытки Chrome запустить его оптимизатор ,

Как можно себе представить, это не самая легкая ошибка для отслеживания, поэтому я просто добавляю это как предложение другой вещи, чтобы рассматривать ее как потенциальную причину страшного «Aw Snap».

Смежные вопросы