2010-10-16 4 views
7

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

Веб-сайт загружает и запускает 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 или наоборот (все недокументированные кстати), но затем проблемы как правило, могут быть воспроизведены при отладке, но не сейчас :(

проблема также происходит не в плагине режиме

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

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

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

+1

Просто шучу - но, ну, вы могли бы быть в состоянии обработать (другое) использовать для IE от этого. Я имею в виду, что вы заканчиваете чтение из некоторого места памяти. Может быть, вы можете заставить это сделать что-то действительно плохое. Кроме того, полностью исправленные и обновленные окна/IE не должны вылетать с любого веб-сайта, независимо от того, насколько неправильным является ваш код. Может быть, есть место, чтобы сообщить об этом? – zerm

+1

Пришлите мне репрографическую страницу или URL-адрес; Я рад, что посмотрю! (ericlaw @ microsoft). Благодаря! – EricLaw

+0

FYI, в следующий раз установите сервер символов на сервер Symbol Server, чтобы получить лучший стек вызовов: http://msdn.microsoft.com/en-us/library/b8ttk8zy%28v=vs.80%29.aspx –

ответ

1

Остановить использование VML?

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

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

0

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

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

+0

Don Не думаю, что это из-за этого, потому что проблема может возникнуть долго после загрузки страницы и взаимодействия с пользователем. Попробуем это проверить, хотя мой инициализатор onload сейчас немного взломан. –

0

Вы используете 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); 
} 

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

+0

Нет, не использовать JSONP или jQuery вообще. –

4

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

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

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

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

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

+0

Yup. Мы ослеплены нашими причудливыми инструментами, но очень часто старые методы работают лучше. –

1

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

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