IE зависает со 100% CPU / Got stack trace - PullRequest
3 голосов
/ 23 февраля 2009

У меня есть ситуация, когда IE7 зависает при доступе к моему веб-приложению. Основываясь на превосходном предложении из Джорджа В. Рейли , я установил WinDbg для загрузки символов IE, настроил Process Explorer для использования этих символов, а затем использовал Process Explorer для получения трассировки стека для подвешенной нити.

Я вставил трассировку стека ниже. Есть ли у кого-то более знакомого с внутренними компонентами IE представление о том, что происходит, или предложение о том, как с этим справиться?

ntkrnlpa.exe!KiUnexpectedInterrupt+0x8d
ntkrnlpa.exe!PsDereferencePrimaryToken+0x362
ntkrnlpa.exe!KiDeliverApc+0xb3
ntkrnlpa.exe!KiDispatchInterrupt+0x5a2
ntkrnlpa.exe!SeOpenObjectAuditAlarm+0x1ce
mshtml.dll!CTreePos::GetCp+0x5a
mshtml.dll!CFlowLayout::GetNestedElementCch+0x7d
mshtml.dll!CDisplay::FormattingNodeForLine+0x1d5
mshtml.dll!CFlowLayout::LineStart+0xdb
mshtml.dll!CDisplayPointer::GetLineStart+0x44
mshtml.dll!CDisplayPointer::IsAtBOL+0x4e
mshtmled.dll!CCaretTracker::PositionCaretAt+0xf9
mshtmled.dll!CCaretTracker::Init2+0x54
mshtmled.dll!CSelectionManager::SetCurrentTracker+0x26
mshtmled.dll!CSelectionManager::CreateTrackerForContext+0x1c0
mshtmled.dll!CSelectionManager::SetEditContext+0x8b
mshtmled.dll!CSelectionManager::SetEditContextFromElement+0x2ed
mshtmled.dll!CSelectionManager::EnsureEditContextClick+0x343
mshtmled.dll!CSelectionManager::HandleEvent+0xb9
mshtmled.dll!CHTMLEditor::PostHandleEvent+0x89
mshtml.dll!CDoc::HandleSelectionMessage+0x1e0
mshtml.dll!CDoc::PumpMessage+0xb69
mshtml.dll!CDoc::OnMouseMessage+0x3d7
mshtml.dll!CDoc::OnWindowMessage+0x748
mshtml.dll!CServer::WndProc+0x78
USER32.dll!InternalCallWinProc+0x28
USER32.dll!UserCallWinProcCheckWow+0x150
USER32.dll!CallWindowProcAorW+0x98
USER32.dll!CallWindowProcW+0x1b
IEDevToolbar.dll!DllUnregisterServer+0xe21d
USER32.dll!InternalCallWinProc+0x28
USER32.dll!UserCallWinProcCheckWow+0x150
USER32.dll!DispatchMessageWorker+0x306
USER32.dll!DispatchMessageW+0xf
IEFRAME.dll!CTabWindow::_TabWindowThreadProc+0x189
kernel32.dll!BaseThreadStart+0x37

Ответы [ 2 ]

3 голосов
/ 23 февраля 2009

На основании трассировки стека он находится в процессе изменения DOM. Как прокомментировал ваш предыдущий пост, IE крайне неэффективен при чтении и записи в DOM (по сравнению с Firefox и Chrome.)

Проблемы производительности могут быть решены путем сокращения и оптимизации как чтения, так и записи DOM:

  1. навигация по DOM с использованием простых свойств и методов DOM, когда это возможно (Document.getElementById, DomElement.parentNode, DomElement.childNodes[], DomElement.nextSibling и т. Д.) Вместо методов выбора XPATH (CSS) (DomElement.querySelector)
    • это потому, что querySelector ведет себя O (N) в IE , где N - это размер всего DOM - то есть вы заплатите штраф за обход весь DOM, даже если вы вызываете querySelector на листовом узле, у которого нет дочерних элементов!
    • если вы инициируете один или несколько вызовов querySelector для каждого элемента в значительном подмножестве DOM, вы по сути платите O (N ^ 2) штраф
    • обратите внимание, что YUI YAHOO.util.Selector.query, прототип element.down, element.up, element.select все используют querySelector вызов внутри
  2. изменение поведения пользовательского интерфейса, если это возможно, чтобы пропустить или отложить как можно больше обхода и модификации DOM
    • представлять как можно меньше информации за раз; заставить пользователя нажать (например, развернуть ссылки и т. д.), чтобы продолжить дополнительную обработку / изменения
  3. переключиться с Javascript на Flash или Java.

Принимая во внимание, что вы используете YUI, у вас может не быть большой широты, как в варианте 1, и я могу представить, что вариант 3 почти наверняка не для вас. К сожалению, оставляет вариант 2.

1 голос
/ 23 февраля 2009

Он зависает во всех браузерах или только в IE7?

Единственное, что выделяется для меня - это "IEDevToolbar.dll!"

Также ... это может быть ваше приложение, которое делает то, что не должно.

...