在过去的几个月里,我一直在整理自己的基于QtWebKit的浏览器(WildFox,获得BSD许可),这是一次非常愉快的体验。我注意到奇怪的崩溃,基本上从一开始就是这样。昨天我决定深入研究这些崩溃,因为它未能重复加载我的个人网站www.mayaposch.com。
事件序列如下:我使用load()
或setUrl()
告诉QWebView
元素加载http://www.mayaposch.com,loadFinished()
返回false,表示在加载页面时出现问题,然后应用程序分段出错。
我正在使用Qt 4.8(最新的SDK),包括发布和调试库(动态)。
使用gdb运行调试版本时的堆栈跟踪:
0 WTF::HashTable<WTF::RefPtr<WebCore::ResourceLoader>, std::pair<WTF::RefPtr<WebCore::ResourceLoader>, WTF::RefPtr<WebCore::SubstituteResource> >, WTF::PairFirstExtractor<std::pair<WTF::RefPtr<WebCore::ResourceLoader>, WTF::RefPtr<WebCore::SubstituteResource> > >, WTF::PtrHash<WTF::RefPtr<WebCore::ResourceLoader> >, WTF::PairHashTraits<WTF::HashTraits<WTF::RefPtr<WebCore::ResourceLoader> >, WTF::HashTraits<WTF::RefPtr<WebCore::SubstituteResource> > >, WTF::HashTraits<WTF::RefPtr<WebCore::ResourceLoader> > >::isEmpty() const D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xbcd036e
1 WTF::HashMap<WTF::RefPtr<WebCore::ResourceLoader>, WTF::RefPtr<WebCore::SubstituteResource>, WTF::PtrHash<WTF::RefPtr<WebCore::ResourceLoader> >, WTF::HashTraits<WTF::RefPtr<WebCore::ResourceLoader> >, WTF::HashTraits<WTF::RefPtr<WebCore::SubstituteResource> > >::isEmpty() const D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xbcc7315
2 WebCore::DocumentLoader::cancelPendingSubstituteLoad(WebCore::ResourceLoader*) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb3cbb96
3 WebCore::ResourceLoader::didCancel(WebCore::ResourceError const&) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb62277f
4 WebCore::SubresourceLoader::didCancel(WebCore::ResourceError const&) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb75859c
5 WebCore::ResourceLoader::cancel(WebCore::ResourceError const&) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb622900
6 WebCore::ResourceLoader::cancel() D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb62285a
7 WebCore::cancelAll(WTF::HashSet<WTF::RefPtr<WebCore::ResourceLoader>, WTF::PtrHash<WTF::RefPtr<WebCore::ResourceLoader> >, WTF::HashTraits<WTF::RefPtr<WebCore::ResourceLoader> > > const&) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb3c8725
8 WebCore::DocumentLoader::stopLoadingSubresources() D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb3cbfa4
9 WebCore::DocumentLoader::stopLoading() D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb3ca9e0
10 WebCore::FrameLoader::stopAllLoaders(WebCore::ClearProvisionalItemPolicy) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2f3694
11 WebCore::FrameLoader::continueLoadAfterNavigationPolicy(WebCore::ResourceRequest const&, WTF::PassRefPtr<WebCore::FormState>, bool) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2f7d29
12 WebCore::FrameLoader::callContinueLoadAfterNavigationPolicy(void*, WebCore::ResourceRequest const&, WTF::PassRefPtr<WebCore::FormState>, bool) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2f76a1
13 WebCore::PolicyCallback::call(bool) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb56e06c
14 WebCore::PolicyChecker::continueAfterNavigationPolicy(WebCore::PolicyAction) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb56ed26
15 WebCore::FrameLoaderClientQt::callPolicyFunction(void (WebCore::PolicyChecker::*)(WebCore::PolicyAction), WebCore::PolicyAction) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb141188
16 WebCore::FrameLoaderClientQt::dispatchDecidePolicyForNavigationAction(void (WebCore::PolicyChecker::*)(WebCore::PolicyAction), WebCore::NavigationAction const&, WebCore::ResourceRequest const&, WTF::PassRefPtr<WebCore::FormState>) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb146959
17 WebCore::PolicyChecker::checkNavigationPolicy(WebCore::ResourceRequest const&, WebCore::DocumentLoader*, WTF::PassRefPtr<WebCore::FormState>, void (*)(void*, WebCore::ResourceRequest const&, WTF::PassRefPtr<WebCore::FormState>, bool), void*) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb56e7ef
18 WebCore::FrameLoader::loadWithDocumentLoader(WebCore::DocumentLoader*, WebCore::FrameLoadType, WTF::PassRefPtr<WebCore::FormState>) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2f25e9
19 WebCore::FrameLoader::loadWithNavigationAction(WebCore::ResourceRequest const&, WebCore::NavigationAction const&, bool, WebCore::FrameLoadType, WTF::PassRefPtr<WebCore::FormState>) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2f1fc5
20 WebCore::FrameLoader::loadURL(WebCore::KURL const&, WTF::String const&, WTF::String const&, bool, WebCore::FrameLoadType, WTF::PassRefPtr<WebCore::Event>, WTF::PassRefPtr<WebCore::FormState>) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2f17f1
21 WebCore::FrameLoader::loadFrameRequest(WebCore::FrameLoadRequest const&, bool, bool, WTF::PassRefPtr<WebCore::Event>, WTF::PassRefPtr<WebCore::FormState>, WebCore::ReferrerPolicy) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2f1086
22 WebCore::FrameLoader::urlSelected(WebCore::FrameLoadRequest const&, WTF::PassRefPtr<WebCore::Event>, bool, bool, WebCore::ReferrerPolicy, WebCore::ShouldReplaceDocumentIfJavaScriptURL) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2ece3e
23 WebCore::FrameLoader::changeLocation(WTF::PassRefPtr<WebCore::SecurityOrigin>, WebCore::KURL const&, WTF::String const&, bool, bool, bool) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb2ec9de
24 WebCore::ScheduledURLNavigation::fire(WebCore::Frame*) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xbc30de8
25 WebCore::NavigationScheduler::timerFired(WebCore::Timer<WebCore::NavigationScheduler>*) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb3cd565
26 WebCore::Timer<WebCore::NavigationScheduler>::fired() D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xbc7adb2
27 WebCore::ThreadTimers::sharedTimerFiredInternal() D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb4a84e6
28 WebCore::ThreadTimers::sharedTimerFired() D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb4a8433
29 WebCore::SharedTimerQt::timerEvent(QTimerEvent*) D:\Dev\Qt\SDK\Desktop\Qt\4.8.0\mingw\bin\QtWebKitd4.dll 0 0xb686a5a
30 QObject::event qobject.cpp 1157 0x6a22499a
31 QApplicationPrivate::notify_helper qapplication.cpp 4550 0xa4c020
32 QApplication::notify qapplication.cpp 3932 0xa49973
33 QCoreApplication::notifyInternal qcoreapplication.cpp 876 0x6a213252
34 QCoreApplication::sendEvent qcoreapplication.h 231 0x6a283f54
35 QEventDispatcherWin32::event qeventdispatcher_win.cpp 1135 0x6a23ac60
36 QApplicationPrivate::notify_helper qapplication.cpp 4550 0xa4c020
37 QApplication::notify qapplication.cpp 3932 0xa49973
38 QCoreApplication::notifyInternal qcoreapplication.cpp 876 0x6a213252
39 QCoreApplication::sendEvent qcoreapplication.h 231 0x6a283f54
40 QCoreApplicationPrivate::sendPostedEvents qcoreapplication.cpp 1500 0x6a21416d
41 qt_internal_proc qeventdispatcher_win.cpp 496 0x6a238a2f
42 USER32!IsDialogMessageW C:\Windows\syswow64\user32.dll 0 0x75a46238
43 operator+ 0 0x7113ae
44 USER32!AllowForegroundActivation C:\Windows\syswow64\user32.dll 0 0x75a468ea
45 qt_fast_timer_proc qeventdispatcher_win.cpp 428 0x6a2387c8
46 USER32!GetMessageExtraInfo C:\Windows\syswow64\user32.dll 0 0x75a47d31
47 ?? 0
故障线(反汇编)表示为:
0xbcd036e <+0x0006> mov 0xc(%eax),%eax
这是内部QtWebKit
错吗?从堆栈跟踪我会说它是,但我缺乏内部知识来说明出了什么问题。崩溃最常发生在我的个人网站上,但其他人也报告说它在其他网站上崩溃,包括在中断加载时(例如在加载完成之前单击链接)。
感谢您提供的任何帮助。
答案 0 :(得分:1)
在讨论#Qt @Freenode IRC与Net147(Jonathan Liu)之后,确定它确实是由于webkit中的一个错误:https://bugs.webkit.org/show_bug.cgi?id=83565
崩溃是由函数ResourceLoader :: didCancel()中Source / WebCore / loader / ResourceLoader.cpp中的空指针取消引用引起的。 调用m_documentLoader-&gt; cancelPendingSubstituteLoad(this)而不检查m_documentLoader是否为null。
我觉得最有趣的是我的代码触发了这个错误,而Qt浏览器演示却没有。任何愿意弄明白为什么会这样的人都非常欢迎:)