2012-04-09 3 views
1

Die letzten Monate habe ich meinen eigenen QtWebKit-basierten Browser (WildFox, BSD-lizenziert) zusammengestellt und es war eine insgesamt recht angenehme Erfahrung. Ich habe jedoch merkwürdige Unfälle bemerkt, grundsätzlich von Anfang an. Gestern habe ich mich entschieden, diese Abstürze genauer zu betrachten, als es mir nicht gelang, meine persönliche Website www.mayaposch.com zu laden.QtWebKit 2.2 segfaults beim laden einer bestimmten Website

Die Abfolge der Ereignisse ist wie folgt: Ich benutze load() oder setUrl() das QWebView Element zu sagen http://www.mayaposch.com, loadFinished() false zurück zu laden, was auf etwas schief gelaufen ist von der Seite während des Ladens und dann Fehler der Anwendung der Segmentierung.

Ich verwende Qt 4.8 (neueste SDK), beide Release-und Debug-Bibliotheken (dynamisch).

Der Stack-Trace während der Debug mit GDB bauen ausgeführt wird: angegeben wie

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 

Die Verwerfungslinie (Demontage): Das ist ein interner Fehler QtWebKit

0xbcd036e <+0x0006>   mov 0xc(%eax),%eax 

ist? Von der Stack-Spur würde ich sagen, dass es ist, aber mir fehlt das Wissen über seine Interna, um zu sagen, was falsch läuft. Die Abstürze passieren am häufigsten auf meiner persönlichen Website, aber andere haben gemeldet, dass sie auch auf anderen Seiten abstürzt, auch wenn das Laden unterbrochen wird (z. B. Klicken auf einen Link, bevor das Laden beendet ist).

Vielen Dank für Ihre Hilfe.

Antwort

1

Nach einer Diskussion über #Qt @ Freenode IRC mit Net147 (Jonathan Liu) wurde festgestellt, dass es in der Tat aufgrund eines Fehlers in webkit war: https://bugs.webkit.org/show_bug.cgi?id=83565

Der Absturz durch ein Null-Pointer-Dereference verursacht wird, in Quelle/WebCore/loader/ResourceLoader.cpp in der Funktion ResourceLoader :: didCancel(). m_documentLoader-> cancelPendingSubstituteLoad (this) wird ohne Prüfung aufgerufen, wenn m_documentLoader null ist.

Was ich am interessantesten finde ist, dass mein Code diesen Fehler ausgelöst hat, während die Qt Browser-Demo dies nicht getan hat. Wer sich darüber klar werden möchte, warum dies der Fall ist, ist herzlich willkommen :)