3

비교적 큰 ECMAScript 코드베이스 (> 60,000 LOC)에서 작업하고 우리는 두려운 친구 Internet Explorer (특히 6과 7)의 오류를 감지하는 데 어려움을 겪습니다.IE 깨는 ECMAScript/JavaScript 오류 찾기

현재 Google RIA가 Google 크롬, Firefox 3.6, Opera 및 Internet Explorer 8에서 잘 렌더링되지만 IE7 모드에서 Internet Explorer 8을 실행하면 실패하는 문제가 3 일 동안 지속되었습니다. 실제 IE-7 사용).

제 질문은 실제로 : IE7에서 오류가 발생하는 코드를 식별하는 방법은 무엇입니까?

보통 나는 JSLint에 의존하고 있으며 일반적인 용의자 (후행 쉼표, 나는 혐오 스럽다)를 잡는 경향이 있지만,이 특별한 경우에는 소스 코드와 최소화 코드 모두에서 linter를 다시 실행했습니다. 내 평소 용의자를 양보하지 않습니다. 그래서 나는 실수로 IE가 좋아하지 않는 것을 도입했다고 생각한다. (어쩌면 나는 어쩌면 내가 어리석은 곳에서 dojo.map 대신 Array.map을 사용 했는가?) 그리고 내 얼굴에 불면, 나 도움이되지 않는다면 ("[object object]"와 "null"입니다. 따라서 자동으로 실패한 오류 업 스트림이 있었고이 개체가 생성되지 못했다고 가정합니다).

Google Closure Linter를 살펴 보았지만 특별한 결과가 나타나지 않았습니다. Google Closure Compiler가 내 구원자가 될 것이라고 생각지 않습니다. 우리가 적절한 오류를 얻을 수 있도록 IE를 에뮬레이트하는 것처럼 코드를 구문 분석/실행할 수있는 도구 (명령 줄, 웹 서비스 또는 기타)가 있습니까?

팁을 주시면 감사하겠습니다.

편집 : 지금까지 내 문제를 해결하는 데 도움을 주셔서 감사합니다.하지만 내가 묻는 것은 이러한 종류의 검사를 수행하는 도구가 있는지, 특정 브라우저에 대한 기능 집합 및 구문의 유효성을 검사하는 것입니다. . 이것은 제 생각에 JS- 세계에서별로 부족한 것입니다 (FF 나 Chrome에는 그리 밝지 않습니다. 디버거가 좀 더 도움이 될 것입니다).

EDIT2 : 결국 두 분기 간의 모든 코드 변경을 통해 문제가 실제로 이미 있었지만 이전에는 감지되지 않았고 이전 변경 사항으로 돌아가는 것을 확인하여 결국 오늘 (3 일 후) 내 문제의 근원을 발견했습니다. 혼란을 좁히고 궁극적으로 콘솔 로그를 추가하여 결국 실패 지점에 도달하게 될 것입니다 (하나님은 모든 단일 라인에 로그를 추가하는 정규 표현식 지원에 대해 이맥스에게 감사드립니다 ... 무겁지만 작동합니다 ...). 재미있는 사실 : IE는 원래 소스 문제를 잡아서 다시 던지는 try catch 블록에 표시되어야하는 오류 메시지를 삼켰습니다. 아직도 그 이유는 없지만 그렇게하지 않았다면 발견하기가 훨씬 쉬워 졌을 것입니다. 파산 된 경우 그 목적을위한 것이기 때문입니다. 기묘한. 깊은 수준의 재연을 좋아하지 않을 수도 있습니다.

실제 질문에 대해서는 답변을 드릴 수 없습니다.

+0

이전 IE7 모드에서 IE8로 실행하고 디버깅 콘솔을 열면 오류가 발생하는 위치를 가리킬 수 있도록 오류 체크 버튼이 멋지게 나옵니 까? – epascarello

+0

JSLint와 Closure 컴파일러는 브라우저 X보다 Y 구문을 지원하지 않습니다. – epascarello

+0

@epascarello : 예, throw 문 중 하나를 가리킨 다음 stacktrace를 통해 우리가 던진 것을 보여주기 위해 아무 것도 지적하지 않았습니다. 플러스 그것은이 파일에 특정되지 않는 것 : 내가 부트 스트랩에서 시작된 파일의 순서를 변경하면, 그것은 어느 쪽이든 먼저 실패합니다. 나는 JSLint와 Closure가 이것을하지 않는다는 것을 안다. 그러나 대개 브라우저 의존적 인 이슈는 IE7의 쉼표이다. 부여 된 다른 것에 대해서는별로 도움이되지 않습니다. – haylem

답변

2

@galambalazs가 제시하는 것처럼 IE8 디버거를 사용해 볼 수도 있습니다. IE6 시대의 오래된 디버거는 일반적으로 유용하지 않았습니다.

필자가 항상 사용한 저수준 기술은 오류의 원인을 좁히기 위해 내 Javascript 소스의 많은 부분에 내 try/catch 블록을 추가하는 것입니다. 반복적으로 try/catch 블록을 조정하면 소스를 통해 "바이너리 검색"을 수행하여 예외의 원인이되는 코드를 찾을 수 있습니다. Firefox에서 무해한 코드가 있지만 IE의 해석기가 오류라고 생각하는 코드가있을 것입니다. (공정하게, 그것의 일반적으로 IE의 엄격함은 정당하고, 파이어 폭스의 느슨한 행동이 정말 바람직하지 인 경우.) 그래서 다른 말로하면, 당신은 당신이 생각 자바 스크립트 소스를 시작 했죠

, 또는 아마 당신은 당신의 .js 포함 된 모든 파일에이 작업을 수행 할 것 :

// top of Javascript source file foo.js 
try { 
    // ... all the code ... 
} catch (x) { alert("Error in foo.js: " + x); } 

를 이제, 당신이 경고 페이지를로드 얻을 경우, 당신은 오류가 foo.js. 어딘가에 것을 알고 따라서 반으로 나누십시오.

// top of foo.js 
try { 
    // ... half the code, roughly ... 
} 
catch (x) { alert("Error in first half of foo.js: " + x); } 
try { 
    // ... the rest of the code ... 
} catch (x) { alert("Error in second half of foo.js: " + x); } 

이 과정을 반복하면 결국 문제가 발견됩니다.

+0

솔직히 60,000 회선 이상의 b-tree 검색을 기대하지 마십시오. – haylem

+0

10 번 정도 반복하면 문제가있는 곳을 의심하게 될 것입니다. – Pointy

+0

'window.onerror'는 try/catch 블록없이 더 가까이에있게합니다. 'window.onerror = function (msg, url, line) {alert ("줄의 오류"+ line); }' –

0

Microsoft Script Debugger 또는 Internet Explorer Developer Tools을 시도해보십시오.와상의 이전 버전에서 IE 8과 다를 수 있습니다 무엇의 전체 목록은

:

012를 참조하십시오. 가능한 단점은입니다.

마지막으로 각 줄마다 console.log을 수행하면 특정 버그를 쉽게 찾을 수 있지만 코드 양을 고려할 때 실제로 모듈 테스트를 작성해야합니다. 응용 프로그램이 다른 입력 및 조건으로 실제로 실행되도록하는 유일한 방법입니다.

+0

언급 한 바와 같이, IE가 제공 한 메시지는이 경우별로 도움이되지 않습니다. 그것들은 통합 된 디버거에서 왔고, 기본적으로 객체가 존재하지 않기 때문에보고됩니다. 즉, 실패하기 전에 또 다른 오류가 발생했을 가능성이 있습니다. – haylem

+0

내 업데이트를 참조하십시오. 나는 당신의 문제에 대한 MSOT가 DOM과 관련이 있다는 것을 확신합니다. – galambalazs

+0

@galambalazs : RIA 렌더링의이 단계에서는 오류가 발생하기 시작합니다. 여전히 부트 스트랩하고 종속성을로드합니다. 하지만 가능합니다. 목록을보고 다시 연락하겠습니다. 감사. – haylem