swift 如何修复EXC_BAD_ACCESS克恩_INVALID_ADDRESS崩溃

cnh2zyt3  于 11个月前  发布在  Swift
关注(0)|答案(2)|浏览(168)

不幸的是,我从实时应用程序中得到了一些崩溃(我不能重现)。我已经尝试了非常不同的方法来关闭,比如在闭包中添加 [weak self] 或创建 strong self,但它们都不起作用。
我唯一确定的是,用户在很长一段时间(15分钟到1小时)后返回应用程序时会崩溃。我在仪器中运行了不同的僵尸和分配测试,但没有关于泄漏的线索。
我想知道是否有一种逻辑方法来检测EXC_BAD_ACCESS克恩_INVALID_ADDRESS崩溃的原因。我如何添加检查以防止崩溃或调试问题?您能给我一些建议吗?
refreshAd 调用中设置数据对象时,waterfallResponse属性崩溃。

@objc public class AdMediatorBanner {

...// properties
var waterfallResponse: AdMediatorZoneResponse?

...// code blocks

    AdMediatorManager.instance.refreshAd(self.zoneId!, self.adMediatorBannerId!) { [weak self] (data, errorCode) in
                guard let self = self else {
                    return
                }
                if data != nil {
                    self.waterfallResponse = data
                }

... // rest of closure code blocks

字符串
崩溃日志:

Crashed: NSOperationQueue 0x1320da410 (QOS: UNSPECIFIED)
0  libobjc.A.dylib                0x19bc67d90 objc_release + 16
1  XXX                            0x104c213e4 destroy for AdMediatorZoneResponseItem + 4309242852 (<compiler-generated>:4309242852)
2  libswiftCore.dylib             0x1a9a473a0 swift_arrayDestroy + 84
3  libswiftCore.dylib             0x1a979e390 _ContiguousArrayStorage.__deallocating_deinit + 48
4  libswiftCore.dylib             0x1a9a5200c _swift_release_dealloc + 36
5  XXX                            0x104c54cac outlined consume of AdMediatorZoneResponse? + 4309453996 
6  XXX                            0x104c4e7d0 AdMediatorBanner.waterfallResponse.setter + 51 (AdMediatorBanner.swift:51)
7  XXX                            0x104c55910 partial apply for closure #2 in AdMediatorBanner.startAdRequest() + 353 (AdMediatorBanner.swift:353)
8  XXX                            0x104c3cc14 partial apply for closure #1 in AdMediatorManager.refreshAd(_:_:completionHandler:) + 96 (AdMediatorManager.swift:96)
9  XXX                            0x104cb5f9c partial apply for closure #1 in AdMediatorWebRequest.fetchDataFromServer(resultHandler:) + 4309852060 (<compiler-generated>:4309852060)
10 XXX                            0x104cb4e84 thunk for @escaping @callee_guaranteed (@guaranteed Data?, @guaranteed NSURLResponse?, @guaranteed Error?) -> () + 4309847684 (<compiler-generated>:4309847684)
11 CFNetwork                      0x19f1f5b18 CFNetServiceBrowserSearchForServices + 96332
12 CFNetwork                      0x19f206948 _CFHTTPMessageSetResponseProxyURL + 8176
13 Foundation                     0x19c30bcfc __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 24
14 Foundation                     0x19c20dc3c -[NSBlockOperation main] + 104
15 Foundation                     0x19c30e03c __NSOPERATION_IS_INVOKING_MAIN__ + 24
16 Foundation                     0x19c20d914 -[NSOperation start] + 752
17 Foundation                     0x19c30ea68 __NSOPERATIONQUEUE_IS_STARTING_AN_OPERATION__ + 24
18 Foundation                     0x19c30e528 __NSOQSchedule_f + 184
19 libdispatch.dylib              0x19bbe4db4 _dispatch_block_async_invoke2 + 144
20 libdispatch.dylib              0x19bbd833c _dispatch_client_callout + 20
21 libdispatch.dylib              0x19bbdaaf8 _dispatch_continuation_pop + 408
22 libdispatch.dylib              0x19bbda258 _dispatch_async_redirect_invoke + 588
23 libdispatch.dylib              0x19bbe75c0 _dispatch_root_queue_drain + 348
24 libdispatch.dylib              0x19bbe7d9c _dispatch_worker_thread2 + 116
25 libsystem_pthread.dylib        0x19bc3f6d8 _pthread_wqthread + 216
26 libsystem_pthread.dylib        0x19bc459c8 start_wqthread + 8

64jmpszr

64jmpszr1#

找到崩溃原因的一个有用的提示,编辑方案->运行->诊断然后勾选地址消毒器,当你在开发中运行时,应用程序将暂停并向你显示一个变量正在使用的死地址。

cdmah0mi

cdmah0mi2#

尝试在主队列上分配waterfallResponse,如

if data != nil {
    DispatchQueue.main.async { [weak self] in
       self?.waterfallResponse = data
    }
}

字符串
并确保在所有其他可能的地方也这样做。

相关问题