DTSendSignalFlag的替代方案可以识别Instruments中的关键事件?

Rob*_*Rob 20 ios xcode-instruments dtsignalflag

曾经有一个很好的工具,DTSendSignalFlag它是DTPerformanceSession框架的一部分,通过它可以以编程方式将标志插入到仪器中(参见Xcode Instruments跟踪比较).此功能在iOS 7中停止运行.

有没有人成功地DTSendSignalFlag在iOS 7中工作?信号标志是(有?)一种有用的方式,可以通过代码以编程方式在仪器中发布标志(在诊断仪器中的复杂应用程序时非常有用),但是当我在iOS 7模拟器上运行时,我没有看到我在程序中创建的标志.但是当我为iOS 6模拟器安装Xcode 5时,它可以工作.

Rob*_*Rob 33

我们现在可以使用以编程方式插入的路标,而不是使用标记,这些路标在Instrument的"兴趣点"中捕获.在iOS 10和macOS 10.12中,我们可以使用os_signpost.这在WWDC 2016视频系统跟踪深度中进行了说明.

对于那些花费不连续时间的流程,我们可以使用OSLog.begin.例如:

import os.log
Run Code Online (Sandbox Code Playgroud)

为了纪念一个时刻,我们可以使用.end:

private let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
Run Code Online (Sandbox Code Playgroud)

第一个参数只是一些唯一的数字代码,对应于我们将在仪器中使用的"路标代码名称".您可以使用您想要的任何值(介于0和16383之间),但我使用指定任务类型的东西:

let id = OSSignpostID(log: pointsOfInterest)
os_signpost(.begin, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
Run Code Online (Sandbox Code Playgroud)

其余参数可以是.event您想要的任何值,但在我的示例中,我将使用第二个参数作为唯一标识符来匹配重复nameDownload调用,并且我将使用最后一个参数来对我在Instruments中的区域进行颜色编码:

os_signpost(.end, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您可以在Instruments中分析应用程序,单击"仪器"工具栏右侧的"+"按钮,然后添加"兴趣点".通过配置"路标代码名称"以匹配我作为第一个参数传递给我的路标的数值,仪器将实际为我翻译这些代码.一旦我对应用程序进行了分析,我现在就可以清楚地看到我的兴趣点:

在此输入图像描述

在这个快照中,我分析了7个下载操作(橙色)和7个解析操作(绿色),分别限制为两个.当他们完成后,我发布了一个"完成"的路标(红色针脚).但是这个演示应用程序的细节并不重要,相反,这只是说明了如何在仪器的"兴趣点"中呈现单个路标和开始/结束路标.

主要问题是我现在在代码中的事件和我在仪器中看到的事件之间有明确的对应关系.我可以control点击路标范围列表中的条目,并告诉仪器"设置时间过滤器",如果我需要,这样当我回到我的其他仪器(分配或时间分析器或其他)时,检查范围被过滤到我的应用程序中的相关兴趣点.


注意,以上是Swift.在Objective-C中,ParseAPI类似,但您必须包括:

os_signpost(.event, log: pointsOfInterest, name: "Done", "All done")
Run Code Online (Sandbox Code Playgroud)

显然,如何定义代码的枚举也会发生变化.

请注意,此OSSignpostIDAPI是在iOS 10/macOS 10.12中引入的.标题告诉我们早期的OS版本可以使用.end:

在以前版本的操作系统中,应用程序可以使用:

os_signpost(.begin, log: pointsOfInterest, name: "SomeTask")
asynchronousMethod {
    os_signpost(.end, log: pointsOfInterest, name: "SomeTask")
}
Run Code Online (Sandbox Code Playgroud)

记录仪器将显示的事件..begin现已弃用,此接口将替换上述调用.

注意:如果您发现自己必须使用kdebug_signpost早期的操作系统版本,则必须导入kdebug_signpost_start:

kdebug_signpost_start(SignPostCode.download.rawValue, UInt(index), 0, 0, SignPostColor.orange.rawValue)
performDownload {
    kdebug_signpost_end(SignPostCode.download.rawValue, UInt(index), 0, 0, SignPostColor.orange.rawValue)
}
Run Code Online (Sandbox Code Playgroud)

此外,我无法kdebug_signpost_end在任何标题中找到声明,但偶然发现了一个在线参考说这个值kdebug_signpost,我根据经验验证:

kdebug_signpost(SignPostCode.done.rawValue, 0, 0, 0, SignPostColor.red.rawValue)
Run Code Online (Sandbox Code Playgroud)

  • 我可以在新 API 中控制颜色吗?我真的很怀念那个...我知道它为我进行分组,但我无法动态分配组名称 - 那是什么样的向后 API... (2认同)
  • @PauliusLiekis - AFAIK,新的 API 不会公开用于颜色编码的第四个参数。理论上,您可以只使用 kdebug API 并丢失通道,但获得着色,并忽略/抑制弃用警告。但这只是一个短期解决方案。 (2认同)