soranoba
soranoba Author of soranoba.net
programming

動的アクター分離チェックの調査方法

Swift6の動的アクター分離チェックによってクラッシュした場合、正しいコードに飛べず、原因が分かりにくい場合があります。
その場合の調査方法を紹介します。

まず、_dispatch_assert_queue_failが動的アクター分離チェックによるクラッシュです。
フレームを選択してもコードにジャンプしませんが、lldbから該当のコードを確認することができます。

(lldb) bt
* thread #11, queue = 'com.apple.usernotifications.UNUserNotificationServiceConnection.call-out', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
  * frame #0: 0x000000010d6076f5 libdispatch.dylib`_dispatch_assert_queue_fail + 102
    frame #1: 0x000000010d60768f libdispatch.dylib`dispatch_assert_queue + 159
    frame #2: 0x00007ffc124d6271 libswift_Concurrency.dylib`swift_task_isCurrentExecutorImpl(swift::SerialExecutorRef) + 385
    frame #3: 0x000000010d155120 Sample.debug.dylib`closure #1 in ViewController.viewDidLoad(isAuthorized=false, _1=nil) at ViewController.swift:0
    frame #4: 0x000000010d15523f Sample.debug.dylib`thunk for @escaping @callee_guaranteed (@unowned Bool, @guaranteed Error?) -> () at <compiler-generated>:0
    frame #5: 0x000000010d604b3d libdispatch.dylib`_dispatch_call_block_and_release + 12
    frame #6: 0x000000010d605ec6 libdispatch.dylib`_dispatch_client_callout + 8
    frame #7: 0x000000010d60ddcf libdispatch.dylib`_dispatch_lane_serial_drain + 1078
    frame #8: 0x000000010d60eb50 libdispatch.dylib`_dispatch_lane_invoke + 448
    frame #9: 0x000000010d61bc76 libdispatch.dylib`_dispatch_root_queue_drain_deferred_wlh + 318
    frame #10: 0x000000010d61b19d libdispatch.dylib`_dispatch_workloop_worker_thread + 837
    frame #11: 0x000000010d1d9b84 libsystem_pthread.dylib`_pthread_wqthread + 327
    frame #12: 0x000000010d1d8acf libsystem_pthread.dylib`start_wqthread + 15
(lldb) f 3
frame #3: 0x000000010d155120 Sample.debug.dylib`closure #1 in ViewController.viewDidLoad(isAuthorized=false, _1=nil) at ViewController.swift:0
   19  	    override func viewDidLoad() {
   20  	        super.viewDidLoad()
   21
-> 22  	        UNUserNotificationCenter.current().requestAuthorization { isAuthorized, _ in
   23  	            self.isAuthorized = isAuthorized
   24  	        }
   25  	    }
Note: this address is compiler-generated code in function closure #1 (Swift.Bool, Swift.Optional<Swift.Error>) -> () in Sample.ViewController.viewDidLoad() -> () that has no source code associated with it.

この記事で用いたコードはこちらから確認することができます

(Updated: )

comments powered by Disqus