Мой сайт продолжает сбой IE, не могу отлаживать - PullRequest
7 голосов
/ 16 октября 2010

У меня есть веб-сайт, который неожиданно начал сбой в работе Internet Explorer.

Веб-сайт загружается и начинает выполнять javascript, но где-то там взрывается механизм.Я даже не получаю сообщение об ошибке скрипта, оно просто вылетает.Я попытался вручную пройти каждую строку js с помощью встроенного отладчика, но тогда, конечно, проблема не возникает.

Если я выбрал отладку приложения в случае сбоя, я вижу следующее сообщение.

Необработанное исключение в 0x6c5dedf5 в iexplore.exe: 0xC0000005: Место чтения нарушения доступа 0x00000090.

Верхние 5 элементов в стеке вызовов выглядят так

VGX.dll! 6c5dedf5 ()
[Указанные ниже кадры могут быть неправильными и / или отсутствовать, символы для VGX.dll не загружены]
VGX.dll! 6c594d70 ()
VGX.dll! 6c594f63 ()
VGX.dll! 6c595350 ()
VGX.dll! 6c58f5e3 ()
mshtml.dll! 6f88dd17 ()

VGX.dll является частью средства визуализации vml иЯ на самом деле использую VML.Я не удивлен, потому что у меня было так много проблем с vml, атрибуты должны быть установлены в определенном порядке, иногда вы не можете установить атрибуты, когда у вас есть элементы, прикрепленные к DOM или наоборот (все недокументировано, кстати), но тогда проблемыобычно можно воспроизвести при отладке, но не сейчас: (

Проблема также возникает в режиме без плагинов.

Есть ли лучший способ, чем проб и ошибок, чтобы решить эту проблему?

Редактировать: Добавление консоли, выводящей каждое подозрительное изменение в DOM, приводило к возникновению проблемы только иногда (консоль также реализована в javascript на той же странице, я могу видеть вывод даже после того, каксбой, так как окно все еще видно) По-видимому, это какое-то состояние гонки.

Мне удалось отследить его еще дальше, и, похоже, это происходит, когда вы слишком быстро удаляете объект из DOMпосле того, как он был только что добавлен. (скорее всего, только для vml-элементов с каким-то специальным атрибутом, не пробовал furtона) И это не может быть исправлено добавлением мертвой петли перед removeChild (в любом случае, довольно плохое решение), страница должна отображаться браузером один раз после addChild, прежде чем вы сможете вызвать removeChild.Вздох

Ответы [ 5 ]

4 голосов
/ 18 декабря 2012

(старый вопрос, но важный)

У меня была очень похожая проблема - в том числе множество сложных VML (от Рафаэля), и отладка выглядела почти невозможной.

На самом деле, оказалось, что самый простой низкотехнологичный подход - лучший. Это очевидный подход: я пишу здесь, потому что иногда, когда сталкиваешься с пугающей проблемой, очевидные, простые решения - это последнее, о чем думает человек.

Итак, простая отладка старой школы: множество alert("1");, alert("2"); и т. Д. До и после каждого удаленно требовательного или сложного вызова в моем коде, что дает супер-простые надежные точки останова, которые не зависят ни от каких функций (например инструменты разработчика), которые могут сами рухнуть. Затем просто посмотрите, к какому оповещению вы пришли, прежде чем он выйдет из строя - между этим оповещением и следующим должно возникнуть проблема.

Добавляйте больше предупреждений, пока не сузите их до точной линии. В моем случае это не имело ничего общего со сложным VML - это был цикл for, который по какой-то причине продолжался бесконечно только в IE7.

1 голос
/ 12 мая 2013

Это разыменование нулевого указателя, неиспользуемый сбой

1 голос
/ 16 октября 2010

Прекратить использование VML?

Если вам нужны вещи в IE, которые действительно нельзя сделать, перемещая, масштабируя, обрезая и заменяя изображения, подумайте об использовании Flash, Silverlight или аналогичных.

Если ваша жизнь зависит от VML, прочитайте как можно больше об опыте других людей, что может упростить метод проб и ошибок.

0 голосов
/ 05 ноября 2010

Используете ли вы JSONP в любой форме?Популярные реализации, такие как jQuery, стремятся очистить память, удалив узел сценария из DOM после его запуска.Я видел этот сбой Internet Explorer во многих случаях.Никогда не мог понять, какие еще условия должны быть рядом, чтобы вызвать это сбой.Слишком много вещей происходит на других моих страницах.

В любом случае, если вы используете jQuery.getJSON, проверьте следующую строку в источнике jquery: (строка 5556 в jquery 1.4.3):

 } else {
  // Garbage collect
  window[ jsonp ] = undefined;

  try {
   delete window[ jsonp ];
  } catch( jsonpError ) {}
 }

 if ( head ) {
  head.removeChild( script );
 }

Вы можете безопасно удалить это или обусловить его, чтобы это происходило только в браузерах, отличных от IE.Надеюсь, это поможет.

0 голосов
/ 04 ноября 2010

Убедитесь, что ваши сценарии работают после того, как произошло событие DOMReady.IE печально известен сбоями при изменении DOM до его полной загрузки.

В некоторых случаях IE может преждевременно запустить событие DOMReady.См. Больше информации о том, как преодолеть это здесь и здесь .

...