[Qtwebengine] Detect crash of page process

Aleksey Yermakov jp.kuraisu at gmail.com
Mon Mar 14 15:12:38 CET 2016


Hi,

I've tried to reload QWebEngineView after renderProcessTerminated. I'm
deleting QWebEngineView and creating a new one. To crash render process I
just kill QtWebEngineProcess.
I'm able to create a new QWebEngineView just ok, but having problems with
sqlite somewhere in QtWebEngine code, possibly in QuotaDatabase.

Backtrace dumped to stderr after crash shows something strange, but VS2013
callstack shows calls from QuotaDatabase.

Backtrace:

[0314/164228:FATAL:connection.cc(1291)] database is locked
Backtrace:
GetHandleVerifier [0x11A21F21+278721]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x11973FDF+1258623]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x121C1C86+5572854]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x121C620C+5590652]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x121C6FEA+5594202]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x121C6C8F+5593343]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x124D5E2C+8800924]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x1249CA66+8566486]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x1249BDE6+8563286]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x1249A36F+8556511]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x1249B766+8561622]
QtWebEngineCore::URLRequestCustomJobDelegate::qt_static_metacall
[0x11AC7B1C+195052]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x1249A2D0+8556352]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x1249BBFB+8562795]
QtWebEngineCore::BrowserContextAdapter::customUrlSchemeHandlers
[0x116F062F+2140767]
QtWebEngineCore::FilePickerController::qt_static_metacall
[0x107E950B+6668859]
QtWebEngineCore::FilePickerController::qt_static_metacall
[0x10B69E44+10341236]
QtWebEngineCore::FilePickerController::qt_static_metacall
[0x1086B0A5+7200213]
QtWebEngineCore::FilePickerController::qt_static_metacall
[0x1082C79F+6943951]
QtWebEngineCore::BrowserContextAdapter::customUrlSchemeHandlers
[0x116F062F+2140767]
GetHandleVerifier [0x11A3B005+381349]
QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::operator=
[0x123809BB+7403051]
QtWebEngineCore::BrowserContextAdapter::browserContext [0x11089BFA+5313082]
QtWebEngineCore::FilePickerController::qt_static_metacall
[0x10A7B118+9363016]
QtWebEngineCore::BrowserContextAdapter::customUrlSchemeHandlers
[0x116F062F+2140767]
GetHandleVerifier [0x11A3E4CD+394861]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x11983C88+1323304]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x119823C4+1316964]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x1198290D+1318317]
GetHandleVerifier [0x11A437E4+416132]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x11983A97+1322807]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x119B3486+1517862]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x1198394D+1322477]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x119C9F56+1610742]
QtWebEngineCore::FilePickerController::qt_static_metacall
[0x106078D4+4695556]
QtWebEngineCore::FilePickerController::qt_static_metacall
[0x10608B86+4700342]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x119CAA59+1613561]
QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x119D1826+1641670]
BaseThreadInitThunk [0x76B233AA+18]
RtlInitializeExceptionChain [0x77729EF2+99]
RtlInitializeExceptionChain [0x77729EC5+54]

The program has unexpectedly finished.


And here is a call stack I get from VS2013:

Qt5WebEngineCored.dll!base::debug::BreakDebugger() Line 21
Qt5WebEngineCored.dll!logging::LogMessage::~LogMessage() Line 642
Qt5WebEngineCored.dll!sql::Connection::OnSqliteError(int err,
sql::Statement * stmt, const char * sql) Line 1292
Qt5WebEngineCored.dll!sql::Statement::CheckError(int err) Line 354
Qt5WebEngineCored.dll!sql::Statement::StepInternal(bool timer_flag) Line 82
Qt5WebEngineCored.dll!sql::Statement::Run() Line 86
Qt5WebEngineCored.dll!storage::QuotaDatabase::SetOriginLastAccessTime(const
GURL & origin, storage::StorageType type, base::Time last_access_time) Line
210
Qt5WebEngineCored.dll!storage::`anonymous
namespace'::UpdateAccessTimeOnDBThread(const GURL & origin,
storage::StorageType type, base::Time accessed_time, storage::QuotaDatabase
* database) Line 180
Qt5WebEngineCored.dll!base::internal::RunnableAdapter<bool (__cdecl*)(GURL
const & __ptr64,enum storage::StorageType,base::Time,storage::QuotaDatabase
* __ptr64)>::Run(const GURL & <args_0>, const storage::StorageType &
<args_1>, const base::Time & <args_2>, storage::QuotaDatabase * const &
<args_3>) Line 158
Qt5WebEngineCored.dll!base::internal::InvokeHelper<0,bool,base::internal::RunnableAdapter<bool
(__cdecl*)(GURL const & __ptr64,enum
storage::StorageType,base::Time,storage::QuotaDatabase *
__ptr64)>,base::internal::TypeList<GURL const & __ptr64,enum
storage::StorageType const & __ptr64,base::Time const &
__ptr64,storage::QuotaDatabase * __ptr64 const & __ptr64>
>::MakeItSo(base::internal::RunnableAdapter<bool (__cdecl*)(GURL const
&,enum storage::StorageType,base::Time,storage::QuotaDatabase *)> runnable,
const GURL & <args_0>, const storage::StorageType & <args_1>, const
base::Time & <args_2>, storage::QuotaDatabase * const & <args_3>) Line 287
Qt5WebEngineCored.dll!base::internal::Invoker<base::IndexSequence<0,1,2>,base::internal::BindState<base::internal::RunnableAdapter<bool
(__cdecl*)(GURL const & __ptr64,enum
storage::StorageType,base::Time,storage::QuotaDatabase * __ptr64)>,bool
__cdecl(GURL const & __ptr64,enum
storage::StorageType,base::Time,storage::QuotaDatabase *
__ptr64),base::internal::TypeList<GURL,enum
storage::StorageType,base::Time>
>,base::internal::TypeList<base::internal::UnwrapTraits<GURL>,base::internal::UnwrapTraits<enum
storage::StorageType>,base::internal::UnwrapTraits<base::Time>
>,base::internal::InvokeHelper<0,bool,base::internal::RunnableAdapter<bool
(__cdecl*)(GURL const & __ptr64,enum
storage::StorageType,base::Time,storage::QuotaDatabase *
__ptr64)>,base::internal::TypeList<GURL const & __ptr64,enum
storage::StorageType const & __ptr64,base::Time const &
__ptr64,storage::QuotaDatabase * __ptr64 const & __ptr64> >,bool
__cdecl(storage::QuotaDatabase * __ptr64 const &
__ptr64)>::Run(base::internal::BindStateBase * base, storage::QuotaDatabase
* const & <unbound_args_0>) Line 347
Qt5WebEngineCored.dll!base::Callback<void __cdecl(content::DownloadItemImpl
* __ptr64)>::Run(content::DownloadItemImpl * const & <args_0>) Line 397
Qt5WebEngineCored.dll!base::internal::InvokeHelper<0,bool,base::Callback<bool
__cdecl(storage::QuotaDatabase *
__ptr64)>,base::internal::TypeList<storage::QuotaDatabase * __ptr64>
>::MakeItSo(base::Callback<bool __cdecl(storage::QuotaDatabase *)>
runnable, storage::QuotaDatabase * <args_0>) Line 286
Qt5WebEngineCored.dll!base::internal::Invoker<base::IndexSequence<0>,base::internal::BindState<base::Callback<bool
__cdecl(storage::QuotaDatabase * __ptr64)>,bool
__cdecl(storage::QuotaDatabase *
__ptr64),base::internal::TypeList<base::internal::UnretainedWrapper<storage::QuotaDatabase>
>
>,base::internal::TypeList<base::internal::UnwrapTraits<base::internal::UnretainedWrapper<storage::QuotaDatabase>
> >,base::internal::InvokeHelper<0,bool,base::Callback<bool
__cdecl(storage::QuotaDatabase *
__ptr64)>,base::internal::TypeList<storage::QuotaDatabase * __ptr64> >,bool
__cdecl(void)>::Run(base::internal::BindStateBase * base) Line 347
Qt5WebEngineCored.dll!base::Callback<void __cdecl(void)>::Run() Line 397
Qt5WebEngineCored.dll!base::internal::ReturnAsParamAdapter<bool>(const
base::Callback<bool __cdecl(void)> & func, bool * result) Line 23
Qt5WebEngineCored.dll!base::internal::RunnableAdapter<void
(__cdecl*)(base::Callback<void
__cdecl(scoped_ptr<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
>,base::DefaultDeleter<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
> > >)> const &
__ptr64,scoped_ptr<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
>,base::DefaultDeleter<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
> > > * __ptr64)>::Run(const base::Callback<void
__cdecl(scoped_ptr<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
>,base::DefaultDeleter<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
> > >)> & <args_0>,
scoped_ptr<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
>,base::DefaultDeleter<std::vector<net::NetworkInterface,std::allocator<net::NetworkInterface>
> > > * const & <args_1>) Line 158
Qt5WebEngineCored.dll!base::internal::InvokeHelper<0,void,base::internal::RunnableAdapter<void
(__cdecl*)(base::Callback<void __cdecl(int)> const &
__ptr64,__int64)>,base::internal::TypeList<base::Callback<void
__cdecl(int)> const & __ptr64,__int64 const & __ptr64>
>::MakeItSo(base::internal::RunnableAdapter<void
(__cdecl*)(base::Callback<void __cdecl(int)> const &,__int64)> runnable,
const base::Callback<void __cdecl(int)> & <args_0>, const __int64 &
<args_1>) Line 294
Qt5WebEngineCored.dll!base::internal::Invoker<base::IndexSequence<0,1>,base::internal::BindState<base::internal::RunnableAdapter<void
(__cdecl*)(base::Callback<std::set<GURL,std::less<GURL>,std::allocator<GURL>
> __cdecl(void)> const &
__ptr64,std::set<GURL,std::less<GURL>,std::allocator<GURL> > *
__ptr64)>,void
__cdecl(base::Callback<std::set<GURL,std::less<GURL>,std::allocator<GURL> >
__cdecl(void)> const &
__ptr64,std::set<GURL,std::less<GURL>,std::allocator<GURL> > *
__ptr64),base::internal::TypeList<base::Callback<std::set<GURL,std::less<GURL>,std::allocator<GURL>
> __cdecl(void)>,std::set<GURL,std::less<GURL>,std::allocator<GURL> > *
__ptr64>
>,base::internal::TypeList<base::internal::UnwrapTraits<base::Callback<std::set<GURL,std::less<GURL>,std::allocator<GURL>
> __cdecl(void)>
>,base::internal::UnwrapTraits<std::set<GURL,std::less<GURL>,std::allocator<GURL>
> * __ptr64>
>,base::internal::InvokeHelper<0,void,base::internal::RunnableAdapter<void
(__cdecl*)(base::Callback<std::set<GURL,std::less<GURL>,std::allocator<GURL>
> __cdecl(void)> const &
__ptr64,std::set<GURL,std::less<GURL>,std::allocator<GURL> > *
__ptr64)>,base::internal::TypeList<base::Callback<std::set<GURL,std::less<GURL>,std::allocator<GURL>
> __cdecl(void)> const &
__ptr64,std::set<GURL,std::less<GURL>,std::allocator<GURL> > * __ptr64
const & __ptr64> >,void __cdecl(void)>::Run(base::internal::BindStateBase *
base) Line 347
Qt5WebEngineCored.dll!base::Callback<void __cdecl(void)>::Run() Line 397
Qt5WebEngineCored.dll!base::`anonymous
namespace'::PostTaskAndReplyRelay::Run() Line 46
Qt5WebEngineCored.dll!base::internal::RunnableAdapter<void (__cdecl
net::SQLitePersistentCookieStore::Backend::*)(void)
__ptr64>::Run(net::SQLitePersistentCookieStore::Backend * object) Line 177
Qt5WebEngineCored.dll!base::internal::InvokeHelper<0,void,base::internal::RunnableAdapter<void
(__cdecl content::TouchEventQueue::TouchTimeoutHandler::*)(void)
__ptr64>,base::internal::TypeList<content::TouchEventQueue::TouchTimeoutHandler
* __ptr64> >::MakeItSo(base::internal::RunnableAdapter<void (__cdecl
content::TouchEventQueue::TouchTimeoutHandler::*)(void)> runnable,
content::TouchEventQueue::TouchTimeoutHandler * <args_0>) Line 294
Qt5WebEngineCored.dll!base::internal::Invoker<base::IndexSequence<0>,base::internal::BindState<base::internal::RunnableAdapter<void
(__cdecl net::WebSocketChannel::*)(void) __ptr64>,void
__cdecl(net::WebSocketChannel *
__ptr64),base::internal::TypeList<base::internal::UnretainedWrapper<net::WebSocketChannel>
>
>,base::internal::TypeList<base::internal::UnwrapTraits<base::internal::UnretainedWrapper<net::WebSocketChannel>
>
>,base::internal::InvokeHelper<0,void,base::internal::RunnableAdapter<void
(__cdecl net::WebSocketChannel::*)(void)
__ptr64>,base::internal::TypeList<net::WebSocketChannel * __ptr64> >,void
__cdecl(void)>::Run(base::internal::BindStateBase * base) Line 347
Qt5WebEngineCored.dll!base::Callback<void __cdecl(void)>::Run() Line 397
Qt5WebEngineCored.dll!base::debug::TaskAnnotator::RunTask(const char *
queue_function, const char * run_function, const base::PendingTask &
pending_task) Line 64
Qt5WebEngineCored.dll!base::MessageLoop::RunTask(const base::PendingTask &
pending_task) Line 475
Qt5WebEngineCored.dll!base::MessageLoop::DeferOrRunPendingTask(const
base::PendingTask & pending_task) Line 485
Qt5WebEngineCored.dll!base::MessageLoop::DoWork() Line 594
Qt5WebEngineCored.dll!base::MessagePumpDefault::Run(base::MessagePump::Delegate
* delegate) Line 32
Qt5WebEngineCored.dll!base::MessageLoop::RunHandler() Line 439
Qt5WebEngineCored.dll!base::RunLoop::Run() Line 56
Qt5WebEngineCored.dll!base::MessageLoop::Run() Line 288
Qt5WebEngineCored.dll!base::Thread::Run(base::MessageLoop * message_loop)
Line 199
Qt5WebEngineCored.dll!content::BrowserThreadImpl::DBThreadRun(base::MessageLoop
* message_loop) Line 178
Qt5WebEngineCored.dll!content::BrowserThreadImpl::Run(base::MessageLoop *
message_loop) Line 236
Qt5WebEngineCored.dll!base::Thread::ThreadMain() Line 251
Qt5WebEngineCored.dll!base::`anonymous namespace'::ThreadFunc(void *
params) Line 86


Is there some kind of a clean way to reinitialize QtWebEngine in Qt
application short of full apllication restart?
If not, then maybe someone can point me to a way to fix this error with
locked database?

Cheers,
Aleksey

On Fri, Mar 11, 2016 at 5:02 PM, Aleksey Yermakov <jp.kuraisu at gmail.com>
wrote:

> Hi,
>
> I've tried to call QWebEngineView::reload() on renderProcessTerminated
> signal. And when doing both chrome://crash and killing QtWebEngineProcess
> application crashes.
>
> Is there some way to recover from render process crash?
>
> Here is the error message and the backtrace:
>
> [0311/165832:FATAL:mojo_application_host.cc(93)] Check failed:
> client_handle_.is_valid().
> Backtrace:
> GetHandleVerifier [0x11A21F21+278721]
> QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x11973FDF+1258623]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x10923A8A+7956410]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x1070D2C5+5767157]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AE4E9+7475737]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AD8E4+7472660]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AEF77+7478439]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AE25E+7475086]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AECED+7477789]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AEA3A+7477098]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AE164+7474836]
> QtWebEngineCore::FilePickerController::qt_static_metacall
> [0x108AEC20+7477584]
> QtWebEngineCore::BrowserContextAdapter::customUrlSchemeHandlers
> [0x116F062F+2140767]
> GetHandleVerifier [0x11A3E4CD+394861]
> QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x11983C88+1323304]
> QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x119823C4+1316964]
> QtWebEngineCore::CookieMonsterDelegateQt::canSetCookie [0x1198290D+1318317]
> QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::~RenderWidgetHostViewQtDelegateClient
> [0x1011EDA7+77687]
> QtWebEngineCore::RenderWidgetHostViewQtDelegateClient::~RenderWidgetHostViewQtDelegateClient
> [0x1011EC27+77303]
> uppercasebase [0x669D4771+3241114]
> QSpacerItem::geometry [0x647378FB+217080]
> QSpacerItem::geometry [0x64733CEE+201707]
> uppercasebase [0x6698F86C+2958741]
> uppercasebase [0x66998409+2994482]
> uppercasebase [0x66990B66+2963599]
> uppercasebase [0x66A242D4+3567613]
> qt_plugin_query_metadata [0x024F5C70+659833]
> uppercasebase [0x66A2268A+3560371]
> gapfnScSendMessage [0x76E462FA+818]
> GetThreadDesktop [0x76E46D3A+215]
> CharPrevW [0x76E477C4+312]
> DispatchMessageW [0x76E4788A+15]
> uppercasebase [0x66A2300E+3562807]
> qt_plugin_query_metadata [0x024F5C48+659793]
> uppercasebase [0x6698B32C+2941013]
> uppercasebase [0x6698B537+2941536]
> uppercasebase [0x6698DBB2+2951387]
> QOpenGLFunctions_1_4::initializeOpenGLFunctions [0x0F4875F8+414398]
> QSpacerItem::geometry [0x64733949+200774]
> main [0x000E2606+310]
> (d:\qtprojects\qtwebengine-renderprocessterminated-test\main.cpp:16)
> WinMain [0x000E555D+173]
> (c:\qt\5.6-git\src\qtbase\src\winmain\qtmain_win.cpp:113)
> __tmainCRTStartup [0x000E493F+575]
> (f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c:618)
> WinMainCRTStartup [0x000E46FD+13]
> (f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c:466)
> BaseThreadInitThunk [0x76BB33AA+18]
> RtlInitializeExceptionChain [0x77459EF2+99]
> RtlInitializeExceptionChain [0x77459EC5+54]
>
> On Thu, Mar 10, 2016 at 9:29 PM, Aleksey Yermakov <jp.kuraisu at gmail.com>
> wrote:
>
>> Hi Allan,
>>
>> Thanks, I'll check chrome://crash. I tried killing QtWebEngineProcess but
>> QWebEngineView didn't show crash page and just stopped responding. I
>> haven't tested yet, but I'm not sure I'll be able to catch this signal that
>> way. I'll try later though.
>>
>> Cheers,
>> Aleksey
>>
>> On Thu, Mar 10, 2016 at 9:18 PM, Allan Sandfeld Jensen <
>> allan.jensen at theqtcompany.com> wrote:
>>
>>> You can navigate to chrome://crash
>>>
>>> It is one of the few Chrome URLs that always works as expected.
>>>
>>> You can also look for the QtWebEngineProcess and kill it.
>>>
>>> `Allan
>>> On Thursday 10 March 2016, Aleksey Yermakov wrote:
>>> > Hi Kai,
>>> >
>>> > That's exactly what I needed. Thank you.
>>> >
>>> > Do you know an effective way to crash render process for testing
>>> purposes?
>>> >
>>> > Regards,
>>> > Aleksey
>>> >
>>> > On Thu, Mar 10, 2016 at 6:08 PM, Koehne Kai <
>>> Kai.Koehne at theqtcompany.com>
>>> >
>>> > wrote:
>>> > > > -----Original Message-----
>>> > > > From: QtWebEngine [mailto:qtwebengine-
>>> > > > bounces+kai.koehne=theqtcompany.com at qt-project.org] On Behalf Of
>>> > > > Aleksey Yermakov
>>> > > > Sent: Thursday, March 10, 2016 4:02 PM
>>> > > > To: qtwebengine at qt-project.org
>>> > > > Subject: [Qtwebengine] Detect crash of page process
>>> > > >
>>> > > > Hi,
>>> > > >
>>> > > > My QtWebEngine app sometimes experience crashes after
>>> > > > sleep/hibernation which is easily fixed by page reload.
>>> > > >
>>> > > > Is there a way (a signal?) to detect a crash of a page process? If
>>> not,
>>> > >
>>> > > I'm
>>> > >
>>> > > > ready to implement it.
>>> > >
>>> > > Qt 5.6 will feature a renderProcessTerminated signal
>>> > >
>>> > >
>>> > >
>>> http://doc-snapshots.qt.io/qt5-5.6/qwebengineview.html#renderProcessTermi
>>> > > nated
>>> > >
>>> > >
>>> > >
>>> http://doc-snapshots.qt.io/qt5-5.6/qml-qtwebengine-webengineview.html#ren
>>> > > derProcessTerminated-signal
>>> > >
>>> > > Regards
>>> > >
>>> > > Kai
>>>
>>>
>>> --
>>>
>>> The Qt Company
>>> Rudower Chausse 13, 12489 D-Berlin
>>>
>>> The Qt Company is a group company of Digia Plc,
>>> Valimotie 21, FI-00380 Helsinki Finland
>>>
>>
>>
>>
>> --
>> Aleksey Yermakov
>>
>>
>
>
> --
> Aleksey Yermakov
>
>


-- 
Aleksey Yermakov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/qtwebengine/attachments/20160314/36f3638c/attachment.html>


More information about the QtWebEngine mailing list