1

過去数か月、私は独自の QtWebKit ベースのブラウザー ( WildFox、BSD ライセンス) を作成してきましたが、全体的に非常に快適な体験でした。ただし、基本的に最初から奇妙なクラッシュに気付きました。昨日、私の個人的な Web サイト www.mayaposch.com を繰り返しロードできなかったときのクラッシュについて詳しく調べることにしました。

イベントのシーケンスは次のとおりです。load()orを使用して要素にhttp://www.mayaposch.comsetUrl()をロードするように指示すると、false が返され、ページのロード中に問題が発生し、アプリケーション セグメンテーション エラーが発生したことが示されます。QWebViewloadFinished()

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障害ですか?スタック トレースからはそうだと思いますが、何が問題なのかを判断するための内部構造の知識が不足しています。クラッシュは私の個人的なサイトで最も頻繁に発生しますが、読み込みを中断したとき (読み込みが完了する前にリンクをクリックするなど) など、他のサイトでもクラッシュしたと報告されている人もいます。

ご協力いただきありがとうございます。

4

1 に答える 1

1

Net147 (Jonathan Liu) との #Qt @ Freenode IRC に関する議論の後、実際には Webkit のバグが原因であると判断されました: https://bugs.webkit.org/show_bug.cgi?id=83565

クラッシュは、関数 ResourceLoader::didCancel() の Source/WebCore/loader/ResourceLoader.cpp でのヌル ポインター逆参照によって引き起こされます。m_documentLoader->cancelPendingSubstituteLoad(this) は、m_documentLoader が null かどうかをチェックせずに呼び出されます。

私が最も興味深いと思うのは、Qt ブラウザーのデモでは発生しなかったのに、私のコードではこのバグが発生したことです。これが事実である理由を理解しようとする人は誰でも大歓迎です:)

于 2012-04-10T12:32:52.237 に答える