gpt4 book ai didi

ios - GCD dispatch_after 调用导致 SIGBUS 信号

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:50:31 26 4
gpt4 key购买 nike

当加载我的应用程序以执行某些行为时,我正在使用 GCD 的 dispatch_after 方法。预期行为是从 applicationDidFinishLaunchingWithOptions 结束后等待 3 秒,以执行在后台队列中运行的选择器。

我的测试设备没有遇到任何崩溃,但我有未捕获 SIGBUS 信号的用户崩溃报告,原因是 BUS_ADRALN 异常。根据我对这段代码的理解,BUS_ADRALN 错误表示地址对齐错误。

这就是我创建计时器的方式:

double delayInSeconds = 3.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),
^(void){
[self methodToPerformInBackground];
});

是什么导致了这次崩溃?

由于多线程错误可能是一种奇怪的野兽,我将抛出一些我一直在脑海中反复思考的想法。

  • 我是在对 [self performSelectorOnMainThread:withObject:waitUntilDone] 的调用中调用它的。在以这种方式调用的选择器中执行此操作是否有问题?
  • 因为我调用的是 dispatch_get_global_queue 而不是 dispatch_create_queue,所以我不需要保留此方法返回的队列。这个推理正确吗?
  • 在此代码中,self 是应用程序委托(delegate)。会不会是应用进入后台或终止后试图执行block导致的crash?应用程序会在关闭时自动清理所有分派(dispatch)的 block 吗?
  • 被调用方法内部的某些东西导致了崩溃,但 GCD 不提供堆栈跟踪。

编辑:我宁愿不包含 block 中调用的代码,因为我不相信这是主要问题。这是堆栈跟踪。线程 0 上的崩溃使得问题似乎出在 GCD 中,而不是 block 中调用的代码。

编辑 #2: 在查看了更多崩溃报告后,我有一个奇怪的消息要分享。此崩溃仅出现在运行 iOS 4.2.X 及以下版本的用户身上。由于 iOS 4.0 及更高版本支持 GCD,我猜测 4.3 中修复了一个错误。

Thread 0 Crashed:
0 libSystem.B.dylib 0x35e5fb10 _dispatch_retain + 0
1 libSystem.B.dylib 0x35e5df8c dispatch_after_f + 80
2 libSystem.B.dylib 0x35e5e070 dispatch_after + 72
3 MyApplication 0x0000466c -[MyApplicationDelegate applicationDidFinishLaunchingPart2:] (MyApplicationDelegate.m:366)
4 CoreFoundation 0x37538f79 -[NSObject(NSObject) performSelector:withObject:] + 25
5 Foundation 0x35171e6d __NSThreadPerformPerform + 273
6 CoreFoundation 0x375518d1 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
7 CoreFoundation 0x37521ecd __CFRunLoopDoSources0 + 385
8 CoreFoundation 0x375216f9 __CFRunLoopRun + 265
9 CoreFoundation 0x3752150b CFRunLoopRunSpecific + 227
10 CoreFoundation 0x37521419 CFRunLoopRunInMode + 61
11 GraphicsServices 0x33e76d24 GSEventRunModal + 196
12 UIKit 0x3591d57c -[UIApplication _run] + 588
13 UIKit 0x3591a558 UIApplicationMain + 972
14 MyApplication 0x00003024 main (main.m:113)

Thread 1:
0 libSystem.B.dylib 0x35d8f974 kevent + 24
1 libSystem.B.dylib 0x35e5dd70 _dispatch_queue_invoke + 104
2 libSystem.B.dylib 0x35e5d790 _dispatch_worker_thread2 + 128
3 libSystem.B.dylib 0x35de6978 _pthread_wqthread + 400

Thread 2:
0 libSystem.B.dylib 0x35de72fc __workq_kernreturn + 8

Thread 3:
0 libSystem.B.dylib 0x35d5b3b0 mach_msg_trap + 20
1 CoreFoundation 0x37521f83 __CFRunLoopServiceMachPort + 95
2 CoreFoundation 0x37521787 __CFRunLoopRun + 407
3 CoreFoundation 0x3752150b CFRunLoopRunSpecific + 227
4 CoreFoundation 0x37521419 CFRunLoopRunInMode + 61
5 WebCore 0x3318bd1c _ZL12RunWebThreadPv + 532
6 libSystem.B.dylib 0x35de5b4c _pthread_start + 372

Thread 4:
0 libSystem.B.dylib 0x35d5b3b0 mach_msg_trap + 20
1 CoreFoundation 0x37521f83 __CFRunLoopServiceMachPort + 95
2 CoreFoundation 0x37521787 __CFRunLoopRun + 407
3 CoreFoundation 0x3752150b CFRunLoopRunSpecific + 227
4 CoreFoundation 0x37521419 CFRunLoopRunInMode + 61
5 Foundation 0x3517ec55 +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:] + 217
6 Foundation 0x3515cb91 -[NSThread main] + 49
7 Foundation 0x35155b97 __NSThread__main__ + 915
8 libSystem.B.dylib 0x35de5b4c _pthread_start + 372

最佳答案

DISPATCH_QUEUE_PRIORITY_BACKGROUND 是 iOS 5.0+ 的功能。如果你尝试在 iOS 4.x 上使用它,它将是 NULL(当你试图保留它时它会崩溃,因为 GCD 是一个 C 库并且使用 NULL 的方式是不安全的它是在 objective-c 中使用 nil)。参见 this answer获取更多信息。解决方案是改用低优先级,或者使用预处理器指令在两者之间切换。

关于ios - GCD dispatch_after 调用导致 SIGBUS 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11182453/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com