25

曾经有一个很好的工具,DTSendSignalFlagDTPerformanceSession框架的一部分,您可以通过它以编程方式将标志插入 Instruments(请参阅Xcode Instruments 跟踪比较)。此功能在 iOS 7 中停止工作。

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

4

2 回答 2

43

我们现在可以使用在 Instrument 的“兴趣点”中捕获的以编程方式插入的路标,而不是使用标志。

在 iOS 13 和 macOS 10.15 中,我们可以使用os_signpost. 这在 WWDC 2019 视频Getting Started with Instruments中有说明。

例如,在 Swift 中:

  • 导入统一的日志框架:

    import os.log
    
  • 创建一个OSLog兴趣点:

    private let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
    
  • 当你想开始一个兴趣点范围时,你可以.begin一个兴趣点:

    let id = OSSignpostID(log: pointsOfInterest)
    os_signpost(.begin, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
    
  • 当您想结束兴趣点范围时,您可以.end

    os_signpost(.end, log: pointsOfInterest, name: "Download", signpostID: id, "Download %d", index)
    
  • 如果您对时间范围不感兴趣,而对单个路标感兴趣,则可以发布.event

    os_signpost(.event, log: pointsOfInterest, name: "Done", "All done")
    

或者在 Objective-C 中:

  • 导入统一的日志记录路标框架:

    @import os.signpost;
    
  • 创建一个OSLog兴趣点:

    os_log_t log = os_log_create("ViewController", OS_LOG_CATEGORY_POINTS_OF_INTEREST);
    
  • 当你想开始一个兴趣点范围时,你可以.begin一个兴趣点:

    os_signpost_id_t identifier = os_signpost_id_generate(log);
    os_signpost_interval_begin(log, identifier, "Download", "Started %d", index);
    
  • 当您想结束兴趣点范围时,您可以.end

    os_signpost_interval_end(log, identifier, "Download", "Finished %d", index);
    
  • 如果您对时间范围不感兴趣,而对单个路标感兴趣,则可以发布.event

    os_signpost_event_emit(log, OS_SIGNPOST_ID_EXCLUSIVE, "Done");
    

无论如何,“兴趣点”工具现在可以在 Instruments 中以图形方式表示一系列下载和解析操作(每个队列限制为每个队列两个并发操作):

在此处输入图像描述

请注意,这些name值(一组我使用了名称Download,另一组我使用了Parse)在兴趣点工具中很好地分成了不同的泳道。而且因为我使用了可选的格式字符串,我实际上可以看到消息,我可以清楚地将每个下载和解析操作与我的应用程序中的特定任务相关联。

上面我使用了可选OSSignpostID参数,因为我有多个重叠的范围,我想避免将特定.end与对应的.begin. 如果您没有使用兴趣点范围或没有重叠范围,则在不可能存在歧义的情况下,从技术上讲,您不需要使用此可选参数。(即使您使用这些路标标识符,请确保name关联的路标.begin.end路标的

无论如何,既然您拥有填充了信息的“兴趣点”工具,您可以双击一个范围来选择它,或者三次单击它来设置您的检查范围。


在 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)
performDownload {
    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)

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

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

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

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
}

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

在此处输入图像描述

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

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


注意,上面是 Swift。在 Objective-C 中,kdebug_signpostAPI 是类似的,但你必须包括:

#import <sys/kdebug_signpost.h>

显然,您为代码定义枚举的方式也会发生变化。

请注意,此kdebug_signpostAPI 是在 iOS 10/macOS 10.12 中引入的。标头告诉我们早期的操作系统版本可以使用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在任何标题中找到声明,但偶然发现在线参考说这个值是180,我凭经验验证了这一点:

#ifndef SYS_kdebug_trace
#define SYS_kdebug_trace 180
#endif
于 2016-09-09T17:15:54.670 回答
2

2019

路标已使用更简单的 API 进行了更新。视频在这里 ( Time: 20:40)

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

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

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

于 2019-06-19T16:15:06.563 回答