Сбой iOS WKWebView WebUserContentControllerProxy didPostMessage

#ios

Вопрос:

В своем приложении я использую WKWebView для извлечения данных с веб-сайта, которые я обрабатываю в веб-представлении перед отправкой через window.webkit.abc.postMessage(result); . В большинстве случаев это работает хорошо, но иногда требуется обработать большой объем данных, что приводит к сбою приложения в потоке 0 (основной поток?)

Что касается быстрой стороны, я думаю, что сделал все возможное, чтобы избежать ненужного времени выполнения в основном потоке.

В Swift для запуска скрипта, который будет запущен на веб-сайте, я делаю

 DispatchQueue.global(qos: .userInitiated).async {  //some processing  DispatchQueue.main.async {  self.webview?.evaluateJavaScript(js, completionHandler: { ...    

что, по-моему, не является причиной аварии.

Чтобы обработать возвращенные данные, я стараюсь покинуть основной поток как можно раньше:

 func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {    let messageResult = message.body  guard let messageType = MessageTypes.init(rawValue: message.name) else {  return;  }    DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {  //processing the data  

Теперь к самому сбою: множество символов в трассировке можно найти в ссылках в битах webview с открытым исходным кодом. (см. внизу)

Поскольку WebUserContentControllerProxy появляется довольно глубоко в трассировке стека, я полагаю, что проблема где-то там. Однако, поскольку я как можно раньше выгружаю работу из основного потока в этом методе делегирования, я не понимаю, как это может заблокировать основной поток. Чтобы обновить пользовательский интерфейс, я делаю несколько вызовов DispatchQueue.main.async , однако в трассировке стека не отображается никаких ссылок ни на что, что там называется.

Также я смущен тем Fault hit memory shortage , что звучит как проблема с оперативной памятью, а что похоже на проблему с exhausted real (wall clock) time allowance of 10.00 seconds процессором. Добавляя к территории оперативной памяти, в какой-то момент в трассировке говорится 1.5G , что действительно звучит как много для iPhone 6s, однако, если это было причиной, я не понимаю time allowance ошибку, так как я не интерпретирую процессор и оперативную память как взаимозаменяемые таким образом.

Xcode trace screenshot

For more detail, here are the relevant bits of the stack trace:

 {  "uptime" : 570000,  "procLaunch" : "2021-11-24 23:03:38.2950  0100",  "procRole" : "Non UI",  "version" : 2,  "userID" : 501,  "deployVersion" : 210,  "modelCode" : "iPhone8,1",  "procStartAbsTime" : 13804560744125,  "coalitionID" : 6206,  "osVersion" : {  "isEmbedded" : true,  "train" : "iPhone OS 15.0.1",  "releaseType" : "User",  "build" : "19A348"  },  "captureTime" : "2021-11-24 23:03:59.3988  0100",  "incident" : "A93DB923-675B-453E-9365-8EBDBBF6F604",  "bug_type" : "309",  "pid" : 30912,  "procExitAbsTime" : 13805050449362,  "cpuType" : "ARM-64",  "procName" : "--",  "procPath" : "/private/var/containers/Bundle/Application/ --",  "parentProc" : "launchd",  "parentPid" : 1,  "isBeta" : 1,  "basebandVersion" : "9.01.00",  "isCorpse" : 1,  "exception" : {"codes":"0x0000000000000000, 0x0000000000000000","rawCodes":[0,0],"type":"EXC_CRASH","signal":"SIGKILL"},  "termination" : {"flags":6,"code":2343432205,"namespace":"FRONTBOARD","reasons":["lt;RBSTerminateContext| domain:10 code:0x8BADF00D explanation:scene-update watchdog transgression: applicationlt;--tgt;:30912 exhausted real (wall clock) time allowance of 10.00 seconds","ProcessVisibility: Background","ProcessState: Running","WatchdogEvent: scene-update","WatchdogVisibility: Background","WatchdogCPUStatistics: (",""Elapsed total CPU time (seconds): 21.950 (user 21.950, system 0.000), 100% CPU",",""Elapsed application CPU time (seconds): 4.566, 21% CPU"",") reportType:CrashLog maxTerminationResistance:Interactivegt;"]},  "ktriageinfo" : "VM - Fault hit memory shortagenVM - Fault hit memory shortagenVM - Fault hit memory shortagenVM - Fault hit memory shortagenVM - Fault hit memory shortagen",  "faultingThread" : 0,  "threads" : [{"triggered":true,"id":4109934,"queue":"com.apple.main-thread","frames":[{"imageOffset":6292,"symbol":"_platform_memmove","symbolLocation":116,"imageIndex":0},{"imageOffset":1347256,"symbol":"IPC::ArrayReferencelt;unsigned char, 18446744073709551615ulgt;::vector() const","symbolLocation":88,"imageIndex":1},{"imageOffset":5101356,"symbol":"WebKit::WebUserContentControllerProxy::didPostMessage(WTF::ObjectIdentifierlt;WebKit::WebPageProxyIdentifierTypegt;, WebKit::FrameInfoDataamp;amp;, unsigned long long, IPC::ArrayReferencelt;unsigned char, 18446744073709551615ulgt; constamp;, WTF::CompletionHandlerlt;void (IPC::ArrayReferencelt;unsigned char, 18446744073709551615ulgt; constamp;, WTF::String constamp;)gt;amp;amp;)","symbolLocation":476,"imageIndex":1},{"imageOffset":7736324,"symbol":"void IPC::handleMessageAsynclt;Messages::WebUserContentControllerProxy::DidPostMessage, WebKit::WebUserContentControllerProxy, void (WebKit::WebUserContentControllerProxy::*)(WTF::ObjectIdentifierlt;WebKit::WebPageProxyIdentifierTypegt;, WebKit::FrameInfoDataamp;amp;, unsigned long long, IPC::ArrayReferencelt;unsigned char, 18446744073709551615ulgt; constamp;, WTF::CompletionHandlerlt;void (IPC::ArrayReferencelt;unsigned char, 18446744073709551615ulgt; constamp;, WTF::String constamp;)gt;amp;amp;)gt;(IPC::Connectionamp;, IPC::Decoderamp;, WebKit::WebUserContentControllerProxy*, void (WebKit::WebUserContentControllerProxy::*)(WTF::ObjectIdentifierlt;WebKit::WebPageProxyIdentifierTypegt;, WebKit::FrameInfoDataamp;amp;, unsigned long long, IPC::ArrayReferencelt;unsigned char, 18446744073709551615ulgt; constamp;, WTF::CompletionHandlerlt;void (IPC::ArrayReferencelt;unsigned char, 18446744073709551615ulgt; constamp;, WTF::String constamp;)gt;amp;amp;))","symbolLocation":2564,"imageIndex":1},{"imageOffset":7733740,"symbol":"WebKit::WebUserContentControllerProxy::didReceiveMessage(IPC::Connectionamp;, IPC::Decoderamp;)","symbolLocation":76,"imageIndex":1},{"imageOffset":339328,"symbol":"IPC::MessageReceiverMap::dispatchMessage(IPC::Connectionamp;, IPC::Decoderamp;)","symbolLocation":228,"imageIndex":1},{"imageOffset":4204752,"symbol":"WebKit::WebProcessProxy::didReceiveMessage(IPC::Connectionamp;, IPC::Decoderamp;)","symbolLocation":36,"imageIndex":1},{"imageOffset":206380,"symbol":"IPC::Connection::dispatchMessage(std::__1::unique_ptrlt;IPC::Decoder, std::__1::default_deletelt;IPC::Decodergt; gt;)","symbolLocation":712,"imageIndex":1},{"imageOffset":204308,"symbol":"IPC::Connection::dispatchIncomingMessages()","symbolLocation":692,"imageIndex":1},{"imageOffset":16379080,"symbol":"WTF::RunLoop::performWork()","symbolLocation":452,"imageIndex":2},{"imageOffset":16382892,"symbol":"WTF::RunLoop::performWork(void*)","symbolLocation":32,"imageIndex":2},{"imageOffset":729632,"symbol":"__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__","symbolLocation":24,"imageIndex":3},{"imageOffset":795208,"symbol":"__CFRunLoopDoSource0","symbolLocation":204,"imageIndex":3},{"imageOffset":22092,"symbol":"__CFRunLoopDoSources0","symbolLocation":356,"imageIndex":3},{"imageOffset":43544,"symbol":"__CFRunLoopRun","symbolLocation":768,"imageIndex":3},{"imageOffset":122252,"symbol":"CFRunLoopRunSpecific","symbolLocation":572,"imageIndex":3},{"imageOffset":6560,"symbol":"GSEventRunModal","symbolLocation":160,"imageIndex":4},{"imageOffset":5169176,"symbol":"-[UIApplication _run]","symbolLocation":1080,"imageIndex":5},{"imageOffset":2630300,"symbol":"UIApplicationMain","symbolLocation":2060,"imageIndex":5},{"imageOffset":50668,"imageIndex":6},{"imageOffset":98704,"symbol":"start","symbolLocation":444,"imageIndex":7}]},{"id":4109946,"name":"com.apple.uikit.eventfetch-thread","frames":[{"imageOffset":2928,"symbol":"mach_msg_trap","symbolLocation":8,"imageIndex":8},{"imageOffset":4500,"symbol":"mach_msg","symbolLocation":72,"imageIndex":8},{"imageOffset":27344,"symbol":"__CFRunLoopServiceMachPort","symbolLocation":368,"imageIndex":3},{"imageOffset":43960,"symbol":"__CFRunLoopRun","symbolLocation":1184,"imageIndex":3},{"imageOffset":122252,"symbol":"CFRunLoopRunSpecific","symbolLocation":572,"imageIndex":3},{"imageOffset":97132,"symbol":"-[NSRunLoop(NSRunLoop) runMode:beforeDate:]","symbolLocation":232,"imageIndex":9},{"imageOffset":355692,"symbol":"-[NSRunLoop(NSRunLoop) runUntilDate:]","symbolLocation":88,"imageIndex":9},{"imageOffset":4635072,"symbol":"-[UIEventFetcher threadMain]","symbolLocation":512,"imageIndex":5},{"imageOffset":411212,"symbol":"__NSThread__start__","symbolLocation":776,"imageIndex":9},{"imageOffset":9304,"symbol":"_pthread_start","symbolLocation":116,"imageIndex":10},{"imageOffset":2736,"symbol":"thread_start","symbolLocation":8,"imageIndex":10}]},{"id":4109947,"name":"JavaScriptCore bmalloc scavenger","frames":[{"imageOffset":5456,"symbol":"__psynch_cvwait","symbolLocation":8,"imageIndex":8},{"imageOffset":36016,"symbol":"_pthread_cond_wait$VARIANT$mp","symbolLocation":1216,"imageIndex":10},{"imageOffset":37712,"symbol":"std::__1::condition_variable::__do_timed_wait(std::__1::unique_locklt;std::__1::mutexgt;amp;, std::__1::chrono::time_pointlt;std::__1::chrono::system_clock, std::__1::chrono::durationlt;long long, std::__1::ratiolt;1l, 1000000000lgt; gt; gt;)","symbolLocation":96,"imageIndex":11},{"imageOffset":16837684,"symbol":"bmalloc::Scavenger::threadRunLoop()","symbolLocation":796,"imageIndex":2},{"imageOffset":16835656,"symbol":"bmalloc::Scavenger::threadEntryPoint(bmalloc::Scavenger*)","symbolLocation":12,"imageIndex":2},{"imageOffset":16841448,"symbol":"void* std::__1::__thread_proxylt;std::__1::tuplelt;std::__1::unique_ptrlt;std::__1::__thread_struct, std::__1::default_deletelt;std::__1::__thread_structgt; gt;, void (*)(bmalloc::Scavenger*), bmalloc::Scavenger*gt; gt;(void*)","symbolLocation":44,"imageIndex":2},{"imageOffset":9304,"symbol":"_pthread_start","symbolLocation":116,"imageIndex":10},{"imageOffset":2736,"symbol":"thread_start","symbolLocation":8,"imageIndex":10}]},{"id":4110056,"name":"Heap Helper Thread","frames":[{"imageOffset":5456,"symbol":"__psynch_cvwait","symbolLocation":8,"imageIndex":8},{"imageOffset":36016,"symbol":"_pthread_cond_wait$VARIANT$mp","symbolLocation":1216,"imageIndex":10},{"imageOffset":16352220,"symbol":"WTF::ParkingLot::parkConditionallyImpl(void const*, WTF::ScopedLambdalt;bool ()gt; constamp;, WTF::ScopedLambdalt;void ()gt; constamp;, WTF::TimeWithDynamicClockType constamp;)","symbolLocation":3004,"imageIndex":2},{"imageOffset":15187672,"symbol":"bool WTF::Condition::waitUntilUncheckedlt;WTF::Lockgt;(WTF::Lockamp;, WTF::TimeWithDynamicClockType constamp;)","symbolLocation":184,"imageIndex":2},{"imageOffset":16142996,"symbol":"WTF::Detail::CallableWrapperlt;WTF::AutomaticThread::start(WTF::AbstractLocker constamp;)::$_0, voidgt;::call()","symbolLocation":392,"imageIndex":2},{"imageOffset":16496744,"symbol":"WTF::Thread::entryPoint(WTF::Thread::NewThreadContext*)","symbolLocation":256,"imageIndex":2},{"imageOffset":16507316,"symbol":"WTF::wtfThreadEntryPoint(void*)","symbolLocation":12,"imageIndex":2},{"imageOffset":9304,"symbol":"_pthread_start","symbolLocation":116,"imageIndex":10},{"imageOffset":2736,"symbol":"thread_start","symbolLocation":8,"imageIndex":10}]},{"id":4110062,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]},{"id":4110068,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]},{"id":4110069,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]},{"id":4110075,"queue":"NSManagedObjectContext 0x283646ff0","frames":[{"imageOffset":5972,"symbol":"__ulock_wait","symbolLocation":8,"imageIndex":8},{"imageOffset":19332,"symbol":"_dlock_wait","symbolLocation":52,"imageIndex":12},{"imageOffset":18800,"symbol":"_dispatch_thread_event_wait_slow$VARIANT$mp","symbolLocation":52,"imageIndex":12},{"imageOffset":71744,"symbol":"__DISPATCH_WAIT_FOR_QUEUE__","symbolLocation":320,"imageIndex":12},{"imageOffset":70756,"symbol":"_dispatch_sync_f_slow","symbolLocation":136,"imageIndex":12},{"imageOffset":278288,"imageIndex":6},{"imageOffset":1427340,"imageIndex":6},{"imageOffset":142764,"symbol":"developerSubmittedBlockToNSManagedObjectContextPerform","symbolLocation":148,"imageIndex":13},{"imageOffset":410352,"symbol":"_dispatch_client_callout","symbolLocation":16,"imageIndex":12},{"imageOffset":42316,"symbol":"_dispatch_lane_serial_drain$VARIANT$mp","symbolLocation":644,"imageIndex":12},{"imageOffset":45040,"symbol":"_dispatch_lane_invoke$VARIANT$mp","symbolLocation":408,"imageIndex":12},{"imageOffset":84708,"symbol":"_dispatch_workloop_worker_thread","symbolLocation":632,"imageIndex":12},{"imageOffset":3896,"symbol":"_pthread_wqthread","symbolLocation":284,"imageIndex":10},{"imageOffset":2724,"symbol":"start_wqthread","symbolLocation":8,"imageIndex":10}]},{"id":4110096,"queue":"com.apple.root.user-initiated-qos","frames":[{"imageOffset":62284,"symbol":"nanov2_allocate_from_block$VARIANT$mp","symbolLocation":48,"imageIndex":14},{"imageOffset":59236,"symbol":"nanov2_allocate$VARIANT$mp","symbolLocation":124,"imageIndex":14},{"imageOffset":59236,"symbol":"nanov2_allocate$VARIANT$mp","symbolLocation":124,"imageIndex":14},{"imageOffset":59032,"symbol":"nanov2_malloc$VARIANT$mp","symbolLocation":60,"imageIndex":14},{"imageOffset":21624,"symbol":"_malloc_zone_malloc","symbolLocation":148,"imageIndex":14},{"imageOffset":5872,"symbol":"_Block_copy","symbolLocation":144,"imageIndex":15},{"imageOffset":275672,"imageIndex":6},{"imageOffset":375272,"imageIndex":6},{"imageOffset":1427340,"imageIndex":6},{"imageOffset":406252,"symbol":"_dispatch_call_block_and_release","symbolLocation":24,"imageIndex":12},{"imageOffset":410352,"symbol":"_dispatch_client_callout","symbolLocation":16,"imageIndex":12},{"imageOffset":80112,"symbol":"_dispatch_root_queue_drain","symbolLocation":640,"imageIndex":12},{"imageOffset":81852,"symbol":"_dispatch_worker_thread2","symbolLocation":172,"imageIndex":12},{"imageOffset":3836,"symbol":"_pthread_wqthread","symbolLocation":224,"imageIndex":10},{"imageOffset":2724,"symbol":"start_wqthread","symbolLocation":8,"imageIndex":10}]},{"id":4110099,"queue":"com.apple.root.user-initiated-qos","frames":[{"imageOffset":16200,"symbol":"issetugid","symbolLocation":8,"imageIndex":8},{"imageOffset":801532,"symbol":"__CFProcessIsRestricted","symbolLocation":12,"imageIndex":3},{"imageOffset":613264,"symbol":"also_do_stderr","symbolLocation":152,"imageIndex":3},{"imageOffset":403076,"symbol":"_CFLogvEx3","symbolLocation":208,"imageIndex":3},{"imageOffset":284172,"symbol":"_NSLogv","symbolLocation":120,"imageIndex":9},{"imageOffset":120468,"symbol":"specialized withVaListlt;Agt;(_:_:)","symbolLocation":536,"imageIndex":16},{"imageOffset":275320,"imageIndex":6},{"imageOffset":375272,"imageIndex":6},{"imageOffset":1427340,"imageIndex":6},{"imageOffset":406252,"symbol":"_dispatch_call_block_and_release","symbolLocation":24,"imageIndex":12},{"imageOffset":410352,"symbol":"_dispatch_client_callout","symbolLocation":16,"imageIndex":12},{"imageOffset":80112,"symbol":"_dispatch_root_queue_drain","symbolLocation":640,"imageIndex":12},{"imageOffset":81852,"symbol":"_dispatch_worker_thread2","symbolLocation":172,"imageIndex":12},{"imageOffset":3836,"symbol":"_pthread_wqthread","symbolLocation":224,"imageIndex":10},{"imageOffset":2724,"symbol":"start_wqthread","symbolLocation":8,"imageIndex":10}]},{"id":4110100,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]},{"id":4110102,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]},{"id":4110107,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]},{"id":4110108,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]},{"id":4110140,"name":"JSC Heap Collector Thread","frames":[{"imageOffset":5456,"symbol":"__psynch_cvwait","symbolLocation":8,"imageIndex":8},{"imageOffset":36016,"symbol":"_pthread_cond_wait$VARIANT$mp","symbolLocation":1216,"imageIndex":10},{"imageOffset":16352220,"symbol":"WTF::ParkingLot::parkConditionallyImpl(void const*, WTF::ScopedLambdalt;bool ()gt; constamp;, WTF::ScopedLambdalt;void ()gt; constamp;, WTF::TimeWithDynamicClockType constamp;)","symbolLocation":3004,"imageIndex":2},{"imageOffset":15187672,"symbol":"bool WTF::Condition::waitUntilUncheckedlt;WTF::Lockgt;(WTF::Lockamp;, WTF::TimeWithDynamicClockType constamp;)","symbolLocation":184,"imageIndex":2},{"imageOffset":16142996,"symbol":"WTF::Detail::CallableWrapperlt;WTF::AutomaticThread::start(WTF::AbstractLocker constamp;)::$_0, voidgt;::call()","symbolLocation":392,"imageIndex":2},{"imageOffset":16496744,"symbol":"WTF::Thread::entryPoint(WTF::Thread::NewThreadContext*)","symbolLocation":256,"imageIndex":2},{"imageOffset":16507316,"symbol":"WTF::wtfThreadEntryPoint(void*)","symbolLocation":12,"imageIndex":2},{"imageOffset":9304,"symbol":"_pthread_start","symbolLocation":116,"imageIndex":10},{"imageOffset":2736,"symbol":"thread_start","symbolLocation":8,"imageIndex":10}]},{"id":4110141,"frames":[{"imageOffset":2716,"symbol":"start_wqthread","symbolLocation":0,"imageIndex":10}]}],  -- ],"vmSummary" : "ReadOnly portion of Libraries: Total=660.1M resident=0K(0%) swapped_out_or_unallocated=660.1M(100%)nWritable regions: Total=633.1M written=0K(0%) resident=0K(0%) swapped_out=0K(0%) unallocated=633.1M(100%)nn VIRTUAL REGION nREGION TYPE SIZE COUNT (non-coalesced) n=========== ======= ======= nActivity Tracing 256K 1 nColorSync 256K 16 nCoreAnimation 992K 32 nCoreData Object IDs 4112K 2 nFoundation 16K 1 nImage IO 1840K 1 nKernel Alloc Once 32K 1 nMALLOC 590.9M 337 nMALLOC guard page 192K 12 nSQLite page cache 512K 8 nSTACK GUARD 256K 16 nStack 9168K 16 nVM_ALLOCATE 14.5M 152 nWebKit Malloc 12.6M 23 n__DATA 17.2M 543 n__DATA_CONST 44.4M 559 n__DATA_DIRTY 1614K 457 n__FONT_DATA 4K 1 n__LINKEDIT 184.6M 7 n__OBJC_RO 90.4M 1 n__OBJC_RW 3376K 1 n__TEXT 475.5M 570 n__UNICODE 588K 1 ndyld private memory 1024K 1 nlibnetwork 128K 8 nmapped file 59.4M 24 nshared memory 48K 3 n=========== ======= ======= nTOTAL 1.5G 2794 n",  "legacyInfo" : {  "threadTriggered" : {  "queue" : "com.apple.main-thread"  } },  "reportNotes" : [  "thread_get_state(PAGEIN) returned 0x10000003: (ipc/send) invalid destination port",  "thread_get_state(EXCEPTION) returned 0x10000003: (ipc/send) invalid destination port",  "thread_get_state(FLAVOR) returned 0x10000003: (ipc/send) invalid destination port" ] }