У меня есть веб-сайт, который неожиданно начал сбой в работе 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.Вздох