Apple Instruments 在跟踪 iOS 分配时停止工作
Posted
技术标签:
【中文标题】Apple Instruments 在跟踪 iOS 分配时停止工作【英文标题】:Apple Instruments stops working when tracing iOS allocations 【发布时间】:2015-09-08 10:44:22 【问题描述】:我正在使用 Instruments 的 Allocations 工具检查 Xamarin ios 应用的内存使用情况。
我遇到了一个问题,即 Instruments 在不久之后就停止接收任何分配数据。触发问题时,我没有看到应用程序中的内存使用、cpu 使用、时间或位置有任何模式,但大多数情况下它会在大约 12 秒后停止工作。
似乎在设备停止工作的同时记录了以下内容:
kernel[0] <Notice>: Sandbox: SalesApp(2291) deny(1) process-info-pidinfo 1530
kernel[0] <Notice>: Sandbox: SalesApp(2291) deny(1) sysctl-read kern.proc.pid.1530
可能是什么问题?
每次它停止我都可以停止记录蚂蚁重新启动它并再次运行一段时间。
我已尝试重新启动一切,但行为没有改变。 我知道我在去年 12 月遇到了这个问题,但后来在不同版本的 Xcode、iOS、OS X、Xamarin Studio 上,我使用了不同的 iPad。
当前版本:
iOS:9 测试版 5 (13A4325c) OS X:优胜美地 (10.10.5 (14F27)) Xcode/仪器:6.4 (6E35b) Xamarin Studio:5.9.5(内部版本 10) 部署目标:7.0Instruments 的屏幕截图,其中录制在 7 秒后立即停止:
【问题讨论】:
【参考方案1】:这是一个known issue,GC 和 Instruments 之间的不幸交互导致进程死锁。
您可以尝试几张(广角)照片并让它发挥作用:
通过在 FinishedLaunching 方法中执行此操作,在主线程上频繁触发 GC:
NSTimer.CreateRepeatingScheduledTimer(0.5, (v) => GC.Collect());
尝试分配更少的内存,以减少 GC 触发的频率(我知道这就是您首先要做的)
尽量只在主线程上做事。当 Instruments 报告一个线程上的分配,而 GC 在另一个线程上运行时,就会发生死锁。如果您只在一个线程上工作,则不会发生死锁。
它通常是随机的,所以有时你可能会很幸运并且它不会死锁。 IOW 只是一次又一次地尝试。
【讨论】:
看来你是对的。只是与应用程序交互不那么快就足以让我继续分析它。升级到 Xcode/Instruments 7.0 beta 也解决了这个问题(尽管这可能是一个幸运的巧合)。 我正在使用 XCode 7.1,但仍然遇到此问题。我的应用程序正在进行大量 API 调用(后台线程/任务),即使尝试垃圾收集的计划计时器,仪器也会 100% 锁定时间 我能够通过执行以下操作来解决死锁: 将我的 iPhone 更新到最新版本的 iOS 9(我落后了一个颠覆)。不要使用 Instruments 启动应用程序,让应用程序已经运行,然后通过 Instruments 中的“正在运行的应用程序”附加。然后遵循@RoyS 关于与应用程序交互非常缓慢的评论。我不得不在两次点击之间等待大约 3-5 秒,否则我会遇到死锁。垃圾收集技巧不适用于我的 API 调用繁重的应用程序 六年后,Xcode 13 和 Xamarin.iOS 15.2.0.17,还是一样。我的应用程序在任务中执行大量 CoreGraphics 调用,并且仪器总是在几秒钟后锁定。没有办法在内存泄漏的地方获得任何有用的信息。我们检查了数百次以确保不会错过任何 Dispose,但也许它也是 Xamarin.iOS 中的错误?以上是关于Apple Instruments 在跟踪 iOS 分配时停止工作的主要内容,如果未能解决你的问题,请参考以下文章