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

时间:2013-09-26 01:27:56

标签: ios xcode-instruments dtsignalflag

过去有一个很好的工具DTSendSignalFlag,它是DTPerformanceSession框架的一部分,您可以通过它以编程方式将标志插入到工具中(参见Xcode Instruments trace comparison)。此功能在iOS 7中停止工作。

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

2 个答案:

答案 0 :(得分:30)

我们现在可以使用以仪器方式插入的路标,而不是使用标志,这些路标是在乐器的“兴趣点”中捕获的。在iOS 10和macOS 10.12中,我们可以使用kdebug_signpost。这在WWDC 2016视频System Trace in Depth中有说明。

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

kdebug_signpost_start(SignPostCode.download.rawValue, UInt(index), 0, 0, SignPostColor.orange.rawValue)
// perform download
kdebug_signpost_end(SignPostCode.download.rawValue, UInt(index), 0, 0, SignPostColor.orange.rawValue)

要标记单个时刻,我们可以使用kdebug_signpost

kdebug_signpost(SignPostCode.done.rawValue, 0, 0, 0, SignPostColor.red.rawValue)

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

enum SignPostCode: UInt32 {   // some custom constants that I'll reference in Instruments
    case download = 0
    case parse = 1
    case done = 2
}

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

end

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

enter image description here

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

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

注意,以上是Swift。在Objective-C中,enum SignPostColor: UInt { // standard color scheme for signposts in Instruments case blue = 0 case green = 1 case purple = 2 case orange = 3 case red = 4 } API类似,但您必须包含:

kdebug_signpost

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

请注意,这个#import <sys/kdebug_signpost.h> API是在iOS 10 / macOS 10.12中引入的。标题告诉我们早期的OS版本可以使用kdebug_signpost

  

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

syscall
     

记录仪器将显示的事件。现已弃用syscall(SYS_kdebug_trace, APPSDBG_CODE(DBG_MACH_CHUD, <your event code>) | DBG_FUNC_<type>, arg1, arg2, arg3, arg4); ,此接口将替换上述调用。

注意:如果您发现自己必须在早期操作系统版本上使用syscall(2),则必须导入syscall

<sys/kdebug.h>

另外,我无法在任何标题中找到#import <sys/kdebug.h> 的声明,但偶然发现了一个在线参考说明这个值是SYS_kdebug_trace,我根据经验证实: / p>

180

答案 1 :(得分:1)

2019

路标已使用更简单的API更新。此处的视频(Time: 20:40

https://developer.apple.com/videos/play/wwdc2019/411/

请参阅Apple日志记录文档中的调试CPU性能

https://developer.apple.com/documentation/os/logging