IE挂起100%CPU / Got堆栈跟踪

时间:2009-02-23 02:19:36

标签: internet-explorer windbg stack-trace

我遇到IE7挂起访问我的网络应用程序的情况。基于来自suggestion的优秀George V. Reilly,我安装了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 个答案:

答案 0 :(得分:3)

基于堆栈跟踪,它正在改变DOM。正如您在上一篇文章中所评论的那样,IE在DOM上进行读写操作时效率极低(与Firefox和Chrome相比)。

通过以下方式减少和优化DOM的读取和写入,可以解决性能问题:

  1. 尽可能使用简单的DOM属性和方法(Document.getElementByIdDomElement.parentNodeDomElement.childNodes[]DomElement.nextSibling等)而不是XPATH(CSS)选择器来导航DOM方法(DomElement.querySelector
    • 这是因为 querySelector在IE 下表现为O(N),其中N是整个DOM 的大小 - 也就是说,您将支付即使你在没有子节点的叶节点上调用querySelector,也会遍历整个DOM!
    • 如果您对DOM的相当一部分中的每个元素触发一个或多个querySelector调用,那么您实际上是支付O(N ^ 2)代价
    • 请注意,YUI的YAHOO.util.Selector.query,原型的element.downelement.upelement.select都在内部使用querySelector来电
  2. 如果可能,改变UI行为,以跳过或推迟尽可能多的DOM遍历和修改
    • 一次只显示少量信息;强制用户点击(例如,在展开链接等),以便您继续进行其他处理/修改
  3. 从Javascript切换到Flash或Java。
  4. 鉴于你正在使用YUI,你可能没有足够的自由度,因为选项1可以,我可以想象选项3几乎肯定是你的选择。不幸的是,它留下了选项2。

答案 1 :(得分:1)

它是在所有浏览器中还是只在IE7中挂起?

唯一突出的是“IEDevToolbar.dll!”

另外......可能是你的应用做了不应该的事情。

相关问题