替代DTSendSignalFlag来识别仪器中的关键事件?
曾经有一个很好的工具, DTSendSignalFlag
, DTPerformanceSession
框架的一部分,通过它你可以以编程的方式将标志插入到仪器中(参见Xcode仪器跟踪比较 )。 此function在iOS 7中停止工作。
有没有人成功让DTSendSignalFlag
在iOS 7中工作? 信号标志(是?)是一种有用的方式,通过代码以编程方式在仪器中发布标志(在诊断仪器中的复杂应用程序时非常有用),但是在iOS 7仿真器上运行时,我没有看到在仪器中以编程方式创build的标志但是当我有iOS 6模拟器的Xcode 5版本的时候,它就可以工作)。
我们现在可以使用程序化插入的标志,而不是使用标志,而是使用仪器的“兴趣点”来获取标志。 在iOS 10和MacOS 10.12中,我们可以使用kdebug_signpost
。 WWDC 2016video系统跟踪深入说明了这一点。
对于需要一定时间的进程,我们可以使用kdebug_signpost_start
和kdebug_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, UInt(SignPostColor.red.rawValue))
第一个参数只是一些唯一的数字代码,对应于我们将在Instruments中使用的“路标代码名称”。 你可以使用任何你想要的值(在0到16383之间),但是我使用了一些指定任务types的东西:
enum SignPostCode: UInt32 { // some custom constants that I'll reference in Instruments case download = 0 case parse = 1 case done = 2 }
其余的参数可以是任何你想要的UInt
值,但在我的例子中,我将使用第二个参数作为唯一标识符来匹配重复的start
和end
调用,我将使用最后一个参数来对我的区域进行颜色编码仪器中:
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 }
完成之后,您可以在乐器中对应用进行configuration,点击乐器工具栏右侧的“+”button,然后添加“兴趣点”。 通过configuration“路标代码名称”来匹配我作为第一个parameter passing给我的路标的数字值,乐器实际上将为我翻译这些代码。 一旦我介绍了应用程序,我现在已经明确地强调了我的兴趣点:
在这个快照中,我分析了七个下载操作(橙色)和七个parsing操作(绿色),分别限制为两个。 当他们完成后,我发布了一个“完成”的路标(红色)。 但是这个演示程序的细节并不重要,而只是说明了仪器“兴趣点”中的单个路标和开始/结束路标。
主要的问题是我现在在我的代码中的事件和我在仪器中看到的事件之间有明确的对应关系。 我可以控制 -点击路标范围列表中的一个条目,如果需要的话,告诉乐器“设置时间filter”,以便当我回到我的其他乐器(分配或时间分析器或其他)时,检查范围过滤到我的应用程序的相关兴趣点。
注意:我使用iOS 10 / macOS 10.12中引入的kdebug_signpost
。 标题告诉我们早期的操作系统版本可以使用syscall
:
在以前版本的操作系统中,应用程序可以使用:
syscall(SYS_kdebug_trace, APPSDBG_CODE(DBG_MACH_CHUD, <your event code>) | DBG_FUNC_<type>, arg1, arg2, arg3, arg4);
logging仪器将显示的事件。
syscall(2)
现在被弃用,这个接口取代了上面的调用。
注意:如果您发现自己必须在早期的操作系统版本上使用syscall
,则必须导入<sys/kdebug.h>
:
#import <sys/kdebug.h>
另外,我无法在任何头文件中findSYS_kdebug_trace
的声明,但却偶然发现了一个在线参考文献,说这个值是180
,我经validation:
#ifndef SYS_kdebug_trace #define SYS_kdebug_trace 180 #endif