【问题标题】:Apple Instruments stops working when tracing iOS allocationsApple Instruments 在跟踪 iOS 分配时停止工作
【发布时间】: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.0

Instruments 的屏幕截图,其中录制在 7 秒后立即停止:

【问题讨论】:

    标签: ios ipad xamarin xamarin.ios xcode-instruments


    【解决方案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 中的错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2021-05-26
    • 1970-01-01
    • 2016-12-20
    • 2022-10-04
    • 2013-12-14
    相关资源
    最近更新 更多