在 Instruments 中进行分析时出现 SIGSEGV(Bad Memory Access)错误
Posted
技术标签:
【中文标题】在 Instruments 中进行分析时出现 SIGSEGV(Bad Memory Access)错误【英文标题】:SIGSEGV(Bad Memory Access) error while profiling in Instruments 【发布时间】:2018-12-03 21:56:20 【问题描述】:我正在尝试使用 Instruments 工具中的 Leak Profiler 捕获内存泄漏并保留周期。但是,每当我单击 Instruments 中的录制按钮时,应用程序似乎会启动然后崩溃。如果我从 Xcode 打开应用程序并将其传输到 Instruments,单击任何 UIButton
后应用程序崩溃。如果我从模拟器打开应用程序,我可以获得第二个屏幕,但它也会崩溃。此外,应用程序不会在内存图中显示任何泄漏,并且在正常使用时也不会崩溃。
这是崩溃日志;
异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常子类型:KERN_INVALID_ADDRESS at 0x0000000000000018 VM 区域信息:0x18 不是 在任何地区。以下区域之前的字节:4377985000 区域类型开始 - 结束 [ VSIZE] PRT/MAX SHRMOD 区域详细信息 开始时未使用的空间 ---> __TEXT 0000000104f2c000-0000000104fbc000 [576K] r-x/r-x SM=COW ...ti 应用测试]
终止信号:分段错误:11 终止原因: 命名空间信号,代码 0xb 终止进程:exc 处理程序 [0] 线程触发:0
过滤的系统日志:未找到
线程 0 名称:调度队列:com.apple.main-thread 线程 0 崩溃:0 libswiftCore.dylib 0x000000010597b2b4 0x1058cc000 + 717492 1 libswiftCore.dylib 0x000000010598823c 0x1058cc000 + 770620 2 UIFoundation 0x000000018f01fbdc 属性DictionaryHash + 460 3 基础 0x0000000185417edc hashProbe + 72 4 基础 0x0000000185417e7c -[NSConcreteHashTable getItem:] + 40 5 UIFoundation 0x000000018f01fd54 +[NSAttributeDictionary newWithDictionary:] + 136 6 基础 0x000000018542666c -[NSConcreteAttributedString initWithString:attributes:] + 124 7 我的应用测试 0x0000000104fbb894 0x104f2c000 + 587924 8 我的应用测试 0x0000000104fba588 0x104f2c000 + 583048 9 我的应用测试 0x0000000104fba494 0x104f2c000 + 582804 10 我的应用测试 0x0000000104fb9964 0x104f2c000 + 579940 11 我的应用测试 0x0000000104fb9830 0x104f2c000 + 579632 12 我的应用测试 0x0000000104fcb608 0x104f2c000 + 652808 13 我的应用测试 0x0000000104fccea4 0x104f2c000 + 659108 14 我的应用测试 0x0000000104fcc50c 0x104f2c000 + 656652 15 我的应用测试 0x0000000104fcc5a0 0x104f2c000 + 656800 16 UIKit 0x000000018df36bfc-[UIViewController loadViewIfRequired] + 1040 17 UIKit 0x000000018df367d4-[UIViewController 查看] + 28 18 我的应用程序测试 0x0000000104f85b6c 0x104f2c000 + 367468 19 我的应用程序测试 0x0000000104f85470 0x104f2c000 + 365680 20 我的应用程序测试 0x0000000104f85688 0x104f2c000 + 366216 21 UIKit 0x000000018df6b20c -[UIApplication sendAction:to:from:forEvent:] + 96 22 UIKit 0x000000018df6b18c -[UIControl sendAction:to:forEvent:] + 80 23 UIKit 0x000000018df55f4c -[UIControl _sendActionsForEvents:withEvent:] + 440 24 UIKit 0x000000018df6aa80 -[UIControl touchesEnded:withEvent:] + 576 25 UIKit 0x000000018df6a5a0 -[UIWindow _sendTouchesForEvent:] + 2544 26 UIKit 0x000000018df65a70 -[UIWindow sendEvent:] + 3208 27 UIKit 0x000000018df37078 -[UIApplication sendEvent:] + 340 28 UIKit 0x000000018e876f98 dispatchPreprocessedEventFromEventQueue + 2364 29 UIKit 0x000000018e879408 __handleEventQueueInternal + 4760 30 UIKit 0x000000018e872574 __handleHIDEventFetcherDrain + 152 31 核心基础 0x0000000184ad0358 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 24 32 核心基础 0x0000000184ad02d8 __CFRunLoopDoSource0 + 88 33 CoreFoundation 0x0000000184acfb60 __CFRunLoopDoSources0 + 204 34 CoreFoundation 0x0000000184acd738 __CFRunLoopRun + 1048 35 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 36 图形服务 0x000000018687ff84 GSEventRunModal + 100 37 UIKit 0x000000018df9a880 UIApplicationMain + 208 38 我的应用测试 0x0000000104f97854 0x104f2c000 + 440404 39 libdyld.dylib 0x000000018451256c 开始 + 4
线程 1:0 libsystem_kernel.dylib 0x0000000184641dbc __workq_kernreturn + 8 1 libsystem_pthread.dylib 0x0000000184753144 _pthread_wqthread + 1288 2 libsystem_pthread.dylib 0x0000000184752c30 start_wqthread + 4
线程 2:0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0
线程 3 名称:com.apple.uikit.eventfetch-thread 线程 3:0 libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2 核心基础 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 基础 0x00000001854166e4 -[NSRunLoop+ 50916 (NSRunLoop) runMode:beforeDate:] + 304 6 基础 0x0000000185435afc -[NSRunLoop+ 178940 (NSRunLoop) runUntilDate:] + 96 7 UIKit 0x000000018eae602c -[UIEventFetcher threadMain] + 136 8 基础 0x0000000185517860 __NSThread__start + 996 9 libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 11 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4
线程 4:0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0
线程 5 名称:com.apple.NSURLConnectionLoader 线程 5:0 libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2 核心基础 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 CFNetwork 0x0000000185157b40 +[NSURLConnection+ 715584(加载器) _resourceLoadLoop:] + 404 6 基础 0x0000000185517860 __NSThread__start + 996 7 libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 9 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4
线程 0 因 ARM 线程状态(64 位)而崩溃: x0: 0x00000001c4227ac0 x1: 0x000000018eca2db2 x2: 0x000000016aecf908 x3: 0x0000000000000000 x4:0x0000000000000000 x5:0x0000000000000020 x6:0x0000000185426654 x7:0x0000000000000130 x8: 0x0000000000000000 x9: 0x0000000000000000 x10: 0x0119490101194980 x11: 0x0000000001194901 x12: 0x0000000001194800 x13: 0x0000000000000001 x14: 0x0000000000000000 x15: 0x01194901011949c0 x16: 0x0000000000000000 x17: 0x0000000105988228 x18: 0x0000000000000000 x19: 0x00000001c4227ac0 x20: 0x00000001c4227ac0 x21: 0x00000001b5421000 x22: 0x00000001c0124f60 x23: 0x00000000000000000 x24: 0x00000001c0200730 x25: 0x0000000000000000 x26: 0x000000018eca3f46 x27: 0x00000001b3bca000 x28: 0x00000001c04578e0 fp: 0x000000016aecf4f0 lr: 0x000000010598823c sp: 0x000000016aecf4e0 pc: 0x000000010597b2b4 cpsr: 0x20000000
我搜索了一个月,但不确定它是否是 Instruments 错误。我检查了以下帖子;
Xcode Instruments: Leaks - App crashes on launch
Instruments crashing while using Leaks instrument
xcode instruments causing app crash
编辑:另一个崩溃日志。在这个中,我打开应用程序并将内存转移到 Instruments 工具并触摸 UIView 顶部打开一个新控制器。
日期/时间:2018-07-06 15:13:34.5980 +0300 发布时间:2018-07-06 15:13:19.6298 +0300 操作系统版本:iPhone OS 11.0 (15A372) 基带版本:2.00.01 报告版本:104
异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常子类型: KERN_INVALID_ADDRESS at 0x0000000000000018 VM 区域信息:0x18 不是 在任何地区。以下区域之前的字节:4330094568 区域类型开始 - 结束 [ VSIZE] PRT/MAX SHRMOD 区域详细信息 开始时未使用的空间 ---> __TEXT 0000000102180000-00000001022a0000 [1152K] r-x/r-x SM=COW ...ti Filo 测试]
终止信号:分段错误:11 终止原因: 命名空间信号,代码 0xb 终止进程:exc 处理程序 [0] 线程触发:0
过滤的系统日志:未找到
线程 0 名称:调度队列:com.apple.main-thread 线程 0 崩溃:0 libswiftCore.dylib 0x0000000102bdf278 0x102b30000 + 717432 1 libswiftCore.dylib 0x0000000102bec1b0 0x102b30000 + 770480 2 核心基础 0x0000000184a3ec80 -[NSDictionary allKeys] + 108 3 UIKit 0x000000018e15738c -[NSDictionary+ 2294668 (UIStringDrawingKeyCompatibility) _ui_attributesForDictionaryContainingUIStringDrawingKeys] + 36 4 UIKit 0x000000018e09fde0 -[UINavigationBar setTitleTextAttributes:] + 144 5 我的应用测试 0x00000001021e82e8 0x102180000 + 426728 6 我的应用测试 0x00000001021e67c8 0x102180000 + 419784 7 我的应用测试 0x00000001021e6a14 0x102180000 + 420372 8 UIKit 0x000000018e5c3f78 -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 64 9 UIKit 0x000000018e5c84dc _UIGestureRecognizerSendTargetActions + 124 10 UIKit 0x000000018e0b2dc8 _UIGestureRecognizerSendActions + 320 11 UIKit 0x000000018df67748 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 732 12 UIKit 0x000000018e5b23fc _UIGestureEnvironmentUpdate + 1056 13 UIKit 0x000000018e5b1f88 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 404 14 UIKit 0x000000018e5b10e4 -[UIGestureEnvironment _updateGesturesForEvent:window:] + 276 15 UIKit 0x000000018df65a54 -[UIWindow sendEvent:] + 3180 16 UIKit 0x000000018df37078 -[UIApplication sendEvent:] + 340 17 UIKit 0x000000018e876f98 dispatchPreprocessedEventFromEventQueue + 2364 18 UIKit 0x000000018e879408 __handleEventQueueInternal + 4760 19 UIKit 0x000000018e872574 __handleHIDEventFetcherDrain + 152 20 核心基础 0x0000000184ad0358 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 24 21 核心基础 0x0000000184ad02d8 __CFRunLoopDoSource0 + 88 22 CoreFoundation 0x0000000184acfb60 __CFRunLoopDoSources0 + 204 23 CoreFoundation 0x0000000184acd738 __CFRunLoopRun + 1048 24 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 25 图形服务 0x000000018687ff84 GSEventRunModal + 100 26 UIKit 0x000000018df9a880 UIApplicationMain + 208 27 我的应用测试 0x00000001021facdc 0x102180000 + 503004 28 libdyld.dylib 0x000000018451256c 开始 + 4
线程 1:0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0
线程 2:0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0
线程 3:0 libsystem_pthread.dylib 0x0000000184752c2c start_wqthread + 0
线程 4 名称:com.apple.uikit.eventfetch-thread 线程 4:0 libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2 核心基础 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 基础 0x00000001854166e4 -[NSRunLoop+ 50916 (NSRunLoop) runMode:beforeDate:] + 304 6 基础 0x0000000185435afc -[NSRunLoop+ 178940 (NSRunLoop) runUntilDate:] + 96 7 UIKit 0x000000018eae602c -[UIEventFetcher threadMain] + 136 8 基础 0x0000000185517860 __NSThread__start + 996 9 libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 11 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4
线程 5 名称:GAIThread 线程 5:0 libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2 核心基础 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 核心基础 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 核心基础 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 基础 0x00000001854166e4 -[NSRunLoop+ 50916 (NSRunLoop) runMode:beforeDate:] + 304 6 基础 0x000000018546862c -[NSRunLoop+ 386604 (NSRunLoop) 运行] + 88 7 我的 应用测试 0x000000010225b108 0x102180000 + 897288 8 基础 0x0000000185517860 __NSThread__start + 996 9 libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 10 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 11 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4
线程 6 名称:com.apple.NSURLConnectionLoader 线程 6:0 libsystem_kernel.dylib 0x0000000184620bc4 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x0000000184620a3c mach_msg + 72 2 核心基础 0x0000000184acfce4 CFRunLoopServiceMachPort + 196 3 CoreFoundation 0x0000000184acd8b0 __CFRunLoopRun + 1424 4 CoreFoundation 0x00000001849ee2d8 CFRunLoopRunSpecific + 436 5 CFNetwork 0x0000000185157b40 +[NSURLConnection+ 715584(加载器) _resourceLoadLoop:] + 404 6 基础 0x0000000185517860 __NSThread__start + 996 7 libsystem_pthread.dylib 0x000000018475432c _pthread_body + 308 8 libsystem_pthread.dylib 0x00000001847541f8 _pthread_body + 0 9 libsystem_pthread.dylib 0x0000000184752c38 thread_start + 4
线程 0 因 ARM 线程状态(64 位)而崩溃: x0:0x00000001c4227c60 x1:0x000000018eca2db2 x2:0x0000000000000000 x3:0x000000010637e8d0 x4: 0x00000000000000002 x5: 0x0000000000000020 x6: 0x00000001021e82e8 x7: 0x0000000000000b70 x8: 0x0000000000000000 x9: 0x0000000000000000 x10: 0x01446b0101446b80 x11: 0x0000000001446b01 x12: 0x00000000001446a00 x13: 0x0000000000000001 x14: 0x0000000000000000 x15: 0x01446b0101446bc0 x16: 0x0000000000000000 x17: 0x0000000102bec19c x18: 0x0000000000000000 x19: 0x00000001c4227c60 x20: 0x00000001c4227c60 x21: 0x00000001c4227c60 x22: 0x00000000000000d0 x23: 0x00000000000001f0 x24: 0x0000000000000008 x25: 0x00000001c4107740 x26: 0x00000001c40ca6b0 x27: 0x00000001c4093330 x28: 0x00000001b3f8f000 fp: 0x000000016dc7ce40 lr: 0x0000000102bec1b0 sp:0x000000016dc7ce30 pc:0x0000000102bdf278 cpsr:0x20000000
编辑:在@FranticRock 的回答之后。当我删除 [UINavigationBar setTitleTextAttributes:] 详细信息类可以打开但没有显示任何项目(标题、后退按钮或任何单元格)。它们都是空的,我仍然在泄漏。
这是我编写 [UINavigationBar setTitleTextAttributes:]
的控制器类class WelcomeViewController: BaseViewController
let bgView = UIView()
let backgroundImage = UIImageView()
let logoImage: UIImageView =
let i = UIImageView()
i.image = UIImage(named: "full_logo")
i.contentMode = .scaleAspectFit
return i
()
let welcomeLabel : UILabel =
let l = UILabel()
l.font = Fonts.font.withSize(24)
l.textColor = UIColor.white
l.textAlignment = .center
l.numberOfLines = 0
l.sizeToFit()
return l
()
let loginLbl: UILabel =
let l = UILabel()
l.font = Fonts.font.withSize(13)
l.textColor = UIColor.white
l.textAlignment = .center
l.numberOfLines = 0
l.sizeToFit()
return l
()
let adminBtn: UIButton =
let b = UIButton()
b.backgroundColor = Color.Common.buttonColor
b.layer.cornerRadius = 6.0
return b
()
let userBtn: UIButton =
let b = UIButton()
b.backgroundColor = Color.Common.buttonColor
b.layer.cornerRadius = 6.0
return b
()
lazy var supportedServicesView = WelcomeScreenButtonView(text: getLabelText(key: CMSKeys.CMS_LBL_SUPPORTEDSERVICES), imageName: "phone")
lazy var incidentView = WelcomeScreenButtonView(text: getLabelText(key: CMSKeys.CMS_LBL_INCIDENT), imageName: "phone")
lazy var contactUsView = WelcomeScreenButtonView(text: getLabelText(key:CMSKeys.CMS_LBL_CONTACT), imageName: "phone")
lazy var moreView = WelcomeScreenButtonView(text: getLabelText(key:CMSKeys.CMS_LBL_MORE), imageName: "wdiger")
lazy var emergencyBtn = SendButton(text: "Button")
let firstStackView = UIStackView()
let secondStackView = UIStackView()
let thirdStackView = UIStackView()
let btnStackView = UIStackView()
override func viewDidLoad()
super.viewDidLoad()
self.setPageID()
designUI()
override func viewDidAppear(_ animated: Bool)
if(AppContext.instance.comesFromURL != nil)
comesFromURL()
override func viewWillAppear(_ animated: Bool)
if(analyticsName != nil)
self.sendDataToGA()
override func viewDidLayoutSubviews()
bgView.anchor(self.thirdStackView.topAnchor, left: self.view.leftAnchor, bottom: self.view.bottomAnchor, right: self.view.rightAnchor, topConstant: 40, leftConstant: 0, bottomConstant: 0, rightConstant: 0, widthConstant: 0, heightConstant: 0)
let margins = view.layoutMarginsGuide
thirdStackView.leadingAnchor.constraint(equalTo: margins.leadingAnchor,constant: 5).isActive = true
thirdStackView.trailingAnchor.constraint(equalTo: margins.trailingAnchor,constant: -5).isActive = true
thirdStackView.bottomAnchor.constraint(equalTo: self.emergencyBtn.topAnchor, constant: -10).isActive = true
thirdStackView.heightAnchor.constraint(equalTo: thirdStackView.widthAnchor, multiplier: 0.77).isActive = true
emergencyBtn.anchor(nil, left: self.view.leftAnchor, bottom: self.bottomLayoutGuide.topAnchor, right: self.view.rightAnchor, topConstant: 10, leftConstant: 20, bottomConstant: 20, rightConstant: 20, widthConstant: 0, heightConstant: 48)
if #available(ios 11.0, *)
logoImage.anchor(self.view.safeAreaLayoutGuide.topAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 40, leftConstant: 80, bottomConstant: 0, rightConstant: 80, widthConstant: 0, heightConstant: 0)
else
logoImage.anchor(self.view.topAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 40, leftConstant: 80, bottomConstant: 0, rightConstant: 80, widthConstant: 0, heightConstant: 0)
// Fallback on earlier versions
logoImage.anchorCenterXToSuperview()
let welcomeLblHeight = heightForView(text: "Welcome", font: welcomeLabel.font, width: self.view.bounds.width)
let loginLblHeight = heightForView(text: "Please Log In", font: loginLbl.font, width: self.view.bounds.width)
welcomeLabel.anchor(self.logoImage.bottomAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 0, leftConstant: 50, bottomConstant: 0, rightConstant: 50, widthConstant: 0, heightConstant: welcomeLblHeight)
loginLbl.anchor(self.welcomeLabel.bottomAnchor, left: self.view.leftAnchor, bottom: nil, right: self.view.rightAnchor, topConstant: 10, leftConstant: 50, bottomConstant: 0, rightConstant: 50, widthConstant: 0, heightConstant: loginLblHeight)
btnStackView.anchor(nil, left: self.view.leftAnchor, bottom: self.thirdStackView.topAnchor, right: self.view.rightAnchor, topConstant: 0, leftConstant: 20, bottomConstant: 20, rightConstant: 20, widthConstant: 0, heightConstant: 50)
backgroundImage.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height - self.bgView.frame.height)
private func designUI()
self.view.translatesAutoresizingMaskIntoConstraints = true
backgroundImage.image = UIImage(named: "background.png")
backgroundImage.contentMode = .scaleAspectFill
self.view.insertSubview(backgroundImage, at: 0)
bgView.backgroundColor = Color.Common.welcomeScreenBackgroundColor
self.view.insertSubview(bgView, at: 1)
view.addSubview(logoImage)
welcomeLabel.text = getLabelText(key: CMSKeys.CMS_LBL_WELCOME)
view.addSubview(welcomeLabel)
loginLbl.text = getLabelText(key: CMSKeys.CMS_LBL_LOGIN)
view.addSubview(loginLbl)
adminBtn.backgroundColor = Color.Common.adminGreen
adminBtn.setTitle(getLabelText(key: CMSKeys.CMS_BTN_ADMIN), for: .normal)
adminBtn.addTarget(self, action: #selector(adminBtnTapped(_:)), for: .touchUpInside)
userBtn.backgroundColor = Color.Common.userGreen
userBtn.setTitle(getLabelText(key: CMSKeys.CMS_BTN_USER), for: .normal)
userBtn.addTarget(self, action: #selector(userBtnTapped(_:)), for: .touchUpInside)
btnStackView.axis = UILayoutConstraintAxis.horizontal
btnStackView.distribution = UIStackViewDistribution.fillEqually
btnStackView.alignment = UIStackViewAlignment.fill
btnStackView.spacing = 10.0
btnStackView.addArrangedSubview(adminBtn)
btnStackView.addArrangedSubview(userBtn)
btnStackView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(btnStackView)
firstStackView.axis = UILayoutConstraintAxis.vertical
firstStackView.distribution = UIStackViewDistribution.fillEqually
firstStackView.alignment = UIStackViewAlignment.fill
firstStackView.spacing = 10.0
firstStackView.addArrangedSubview(supportedServicesView)
firstStackView.addArrangedSubview(contactUsView)
firstStackView.translatesAutoresizingMaskIntoConstraints = false
secondStackView.axis = UILayoutConstraintAxis.vertical
secondStackView.distribution = UIStackViewDistribution.fillEqually
secondStackView.alignment = UIStackViewAlignment.fill
secondStackView.spacing = 10.0
secondStackView.addArrangedSubview(incidentView)
secondStackView.addArrangedSubview(moreView)
secondStackView.translatesAutoresizingMaskIntoConstraints = false
thirdStackView.axis = UILayoutConstraintAxis.horizontal
thirdStackView.distribution = UIStackViewDistribution.fillEqually
thirdStackView.alignment = UIStackViewAlignment.fill
thirdStackView.spacing = 10.0
thirdStackView.addArrangedSubview(firstStackView)
thirdStackView.addArrangedSubview(secondStackView)
thirdStackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(thirdStackView)
//View Tap Gestures
let tapSupportedServices = UITapGestureRecognizer(target: self, action: #selector(self.tapSupportedServices(_:)))
supportedServicesView.addGestureRecognizer(tapSupportedServices)
supportedServicesView.isUserInteractionEnabled = true
let tapIncidentView = UITapGestureRecognizer(target: self, action: #selector(self.tapIncident(_:)))
incidentView.addGestureRecognizer(tapIncidentView)
incidentView.isUserInteractionEnabled = true
let tapContactUs = UITapGestureRecognizer(target: self, action: #selector(self.tapContactUs(_:)))
contactUsView.addGestureRecognizer(tapContactUs)
contactUsView.isUserInteractionEnabled = true
let tapMoreView = UITapGestureRecognizer(target: self, action: #selector(self.tapMore(_:)))
moreView.addGestureRecognizer(tapMoreView)
moreView.isUserInteractionEnabled = true
emergencyBtn.layer.cornerRadius = 6.0
emergencyBtn.addTarget(self, action: #selector(emergenyBtnTapped(_:)), for: .touchUpInside)
self.view.addSubview(emergencyBtn)
@objc func tapSupportedServices(_ sender: UITapGestureRecognizer)
let linkingVC = SupportedServicesFirstViewController()
let controller = createNavController(title: "Services", viewController: linkingVC)
self.present(controller, animated: true)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
private func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat
let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
label.numberOfLines = 0
label.lineBreakMode = NSLineBreakMode.byWordWrapping
label.font = font
label.text = text
label.sizeToFit()
return label.frame.height
//Gets a Title and a ViewController then returns a UINavigationController with attributes
private func createNavController(title: String, viewController: UIViewController) -> UINavigationController
viewController.view.backgroundColor = UIColor(red:0.87, green:0.87, blue:0.87, alpha:1.0)
let navController = UINavigationController(rootViewController: viewController)
navController.navigationBar.topItem?.title = title
navController.navigationBar.barTintColor = Color.NavigationBar.tintColor
navController.navigationBar.tintColor = UIColor.white
//Fix: Leak
navController.navigationBar.titleTextAttributes = [NSAttributedStringKey.foregroundColor: Color.NavigationBar.textColor]
return navController
private func removeViews()
self.emergencyBtn.removeFromSuperview()
self.incidentView.removeFromSuperview()
self.moreView.removeFromSuperview()
self.supportedServicesView.removeFromSuperview()
self.contactUsView.removeFromSuperview()
deinit
print("Welcome Deinited")
removeViews()
【问题讨论】:
在分析时崩溃但不正常的原因很可能是分析使用了发布版本。 在发布中进行分析是不是正确的方式? 绝对是的。但关键是,这显然带来了 Debug 构建没有的线程问题。否则,当您从 Xcode 构建和运行时,您会看到问题。所以我要说的是,尝试更改方案,以便 build-and-run 使用 Release 构建,看看我是否正确(即你崩溃了)。如果是这样,这与仪器无关,现在您的问题只是所有其他线程问题 EXC_BAD_ACCESS 崩溃问题的重复。但如果我错了,那么 Leaks 工具的某些问题尤其可能有问题(你应该提交一个错误)。EXC_BAD_ACCESS
: 可能是因为没有强引用,所以在使用前就被释放了?我不知道self.present(..)
之后是否有很强的参考价值。虽然只是在黑暗中开枪。 UINavigationController deiniting 并使用 UINavigationBar 是绝对可能的。也许派生 UINavigationController,添加一个带有打印行的 deinit,看看它是否过早地 deinit。
【参考方案1】:
在第一个堆栈跟踪中,有与以下内容相关的代码:[UINavigationBar setTitleTextAttributes:] 它试图通过在标题上设置文本属性来自定义导航栏。你这样做吗?您可以尝试将其注释掉,看看问题是否消失了吗?
从技术上讲,您所拥有的并不是内存泄漏。您正在访问一个已释放的对象。您可以做的另一件事是在您正在运行的方案上启用 Zombie Objects,并查看您是否可以获得有关哪个对象被释放的信息。
现在,如果上面的堆栈跟踪都没有将您引导到您直接编写的任何代码,并且您说您已经使用了 Memory Debug Graph 工具并且没有找到对您正在检查泄漏的任何对象的任何强引用,我会在这里使用更有创意的方法来发现问题。我经常使用的方法是消除。开始注释掉控制器的大部分内容,直到只剩下空壳。每次,您都可以将代码减半(记录性能),然后重新测试代码的哪一部分引用了被释放的对象。
显然,由于正常的应用程序操作不会导致错误访问异常,它可能与 XCode / Instruments 内部有关,但是上面的 setTitleTextAttributes 看起来很可疑,我会先尝试缩小是否该问题与导航栏有关。您是否对导航栏 UI 的导航层次结构或自定义做了什么奇怪的事情?
还检查内存中是否存在来自先前导航事件/实例的相同视图控制器的其他实例...听起来 UI 对象正在被释放,然后稍后由异步进程更新。
同时覆盖你的 deinit 。方法并在其中放置一个 print 语句,以检测所有相关对象正在被释放。这将有助于缩小范围,稍后将释放和访问哪个控制器。
它发生在所有 iOS 版本/设备型号上还是仅在特定型号上?
【讨论】:
我会在星期一检查并写下详细信息。谢谢。 当我评论 [UINavigationBar setTitleTextAttributes:] 时,新控制器打开了 UITableView,但后退导航按钮或 tableview 上没有任何项目。 setTitleTextAttributes 在您的代码中的哪个位置完成?哪个视图控制器生命周期方法? viewWillAppear、viewDidAppear 等。您是否覆盖了 deinit print("VC Deinit")?在调用 setTitleTextAttributse 的代码之前,您的视图控制器是 Deinit 吗?如果是这样,为什么它是 deinit ?发布您的代码会很有帮助。 (您可以删除特定于业务的详细信息,只需发布显示与您报告的相同问题的骨架代码) 马上要做的一件事是:您必须调用被覆盖的方法:super.viewWillAppear 和 super.viewDidAppear。 (并确保您的 BaseViewController 在这两种方法中也调用 super )。强烈推荐。 我将它添加到两个控制器中,但泄漏端没有任何影响。【参考方案2】:这个问题提出了两个问题。第一个是分析失败的原因,第二个是您的应用程序存在释放后使用问题的原因。
@FranicRock 对第二期提出了很好的建议。
我对分析问题的建议是尝试一种解决方法。如果您的应用程序可以使用(撰写时)Beta Xcode 10.0 进行编译,那么您可以进入 Edit Schema (Command-<
) 并在运行操作的诊断选项卡中,单击 Logging Malloc Stack带有子选项所有分配和免费历史记录。然后你可以:
-
在模拟器中运行您的应用。
按下调试器区域中的内存图按钮(第 8 个图标,看起来像三个连接在一起的圆圈)
执行文件->导出内存图。
您可以自己研究内存图,也可以将其放在 Pastebin 等公共场所供其他人提供见解。 Apple 有一个关于这种新方法的信息视频:WWDC-2018-416-Memory-Deep-Dive
【讨论】:
以上是关于在 Instruments 中进行分析时出现 SIGSEGV(Bad Memory Access)错误的主要内容,如果未能解决你的问题,请参考以下文章
CreateProcess 时出现 ERROR_FILE_NOT_FOUND
分析多进程 Python 脚本时出现神秘的 pickle 错误
在 Glassfish 4.1.1 上部署 Java EE 时出现 java.lang.NullPointerException