2012-04-18 2 views
1

우리는 자바 스크립트 타이머로 서버를 폴링하는 asp.net mvc 3 애플리케이션을 개발 중입니다. 데이터가 반환되면 jquery 1.7.1 및 knockout 2.0을 사용하여 데이터를 표시합니다. 보기는 텍스트 및 아이콘이 포함 된 알림 div 수를 표시하는 위젯입니다.Sporadic chrom aw snap screens

타이머 간격을 5 초로 늘리고 많은 양의 알림을 반환하면 문제가 발생합니다. 임의의 시간이 지나면 크롬 "Aw Snap"페이지가 나타납니다. 타이머 틱에 3 분에서 30 분 사이의 아무 곳이나. 우리의 애플리케이션은 24/7 브라우저에서 열어야하는데, 이것이 우리가 장기간 테스트를 마친 이유입니다.

연구가 끝나면 Google 크롬 기록을 보는 것 외에 "앗 스냅"페이지를 진단 할 방법이없는 것으로 보입니다. 우리는 Sawbuck을 사용하여 "Aw Snap"페이지가 나타날 때 평범하지 않은 것을 보여주는 자세한 로깅을 시도했습니다.

우리는 DOM에서 요소를 제거하고 코드를 주석 처리하고 CSS 스타일을 제거하고 여기에서 생각할 수있는 모든 것을 시도합니다. 모두 실패했습니다.

누가 다음 단계로 나아갈 지 알고 있습니까? Chrome 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 nc cs = 0023 ss = 002b ds = 002b es = 002b fs = 0053gs = 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 : 내부 :: 호출 0xed + [C! \ B \ std :: less, std :: allocator> *>>, 0>> : : 찾기 + 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- 공식 \ build \ src \ v8 \ src \ api.cc @ 3604 ] chrome_1150000 WebCore :: V8Proxy :: instrumentedCallFunction + 0x13d [c : \ b \ build \ 슬레이브 \ 크롬 - 공식 \ 빌드 \ src \ third_party \ webkit \ 소스 \ webcore \ 바인딩 \ 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.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와는 페이드 통지 된 div에서 설정 살고있다 :

$('#[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을 사용하여 테스트를 수행하면서 크롬 및 웹 개발 프로세스를 모니터링했습니다. "Aw Snap"페이지가 나오기 전에 메모리가 증가하지 않았습니다. – Adam

+0

Sawbuck에서 덤프 파일이 생성되었다는 출력 메시지를 받았습니다. 이 메시지는 "Aw Snap"페이지가 나타난 직후 출력되었습니다. 도움이 될만한 경우 덤프 파일에 대한 링크가 있습니다. http://www.filedropper.com/chrome-last – Adam

+0

구현 한 타이머 코드의 일부 버전을 보여줄 수 있습니까? 아니면 jsfiddle에 넣고 복제 할 수 있는지 확인하십시오. – ericb

답변

1

아마도 다른 폴링 기술을 보길 원할 것입니다. 당신은 얼마나 많은 사용자에 따라, 나는 Signalr보고 제안 : 나는 최근 signalr을 통합하고 함께 knockoutjs하는 방법에 대한 이야기를했다

https://github.com/SignalR/SignalR

.

슬라이드 및 예 : http://bit.ly/FamilyFeudSlides

코드 : https://github.com/jasonmore/familyfeud

+0

나는 그것을 최후의 수단 더미에 놓을 것이다.정보 주셔서 감사합니다 – Adam

0

원인이 최적화 엔진이 될 수 있습니다.

비슷한 문제가 발생하여 V8 엔진 최적화로 인한 Aw Snap 충돌로 문제를 해결할 수있었습니다. 나는 ~ 2400 라인의 큰 기능을 반복적으로 실행했다. 함수의 300 번째 호출 이후 (숫자는 다른 관련없는 변경 사항에 따라 꽤 다양해졌습니다) 최적화 엔진이 시작되어 Windows 작업 관리자는 RAM 사용량이 급증하여 "Aw 스냅 "을 탭에 놓습니다.

크롬을 플래그 --js-flags = "-allow-natives-syntax"로 시작한 다음 기본 V8 자바 스크립트 명령어 %NeverOptimizeFunction(functionName);을 사용하여 Chrome이 해당 최적화 프로그램을 실행하지 못하게 할 수 있음이 밝혀졌습니다. .

짐작할 수 있듯이 이것은 가장 쉬운 버그를 추적하는 것이 아니므로 두려운 "Aw Snap"의 잠재적 인 원인으로 고려해야 할 다른 제안 사항을 추가하기 만하면됩니다.

관련 문제