INSTRUMENTS调试工具的使用(三十三) —— 高级任务之创建自定义Instruments(二)

版本记录

版本号 时间
V1.0 2018.06.15

前言

我们在做app的时候,不是做完功能就结束了,很多时候是需要进行检查和优化的,而xcode自带了一个很好的检查工具,可以检测内存泄漏。还可以查看哪一个方法比较耗时。还可以检测离屏渲染等等,随后的几篇我们就说一下这个工具的使用。感兴趣的可以看这几篇。
1.INSTRUMENTS调试工具的使用(一)
2.INSTRUMENTS调试工具的使用(二)
3.INSTRUMENTS调试工具的使用(三)
4.INSTRUMENTS调试工具的使用(四)
5.INSTRUMENTS调试工具的使用(五)
6.INSTRUMENTS调试工具的使用(六)
7.INSTRUMENTS调试工具的使用(七)
8.INSTRUMENTS调试工具的使用(八)
9.INSTRUMENTS调试工具的使用(九)
10. INSTRUMENTS调试工具的使用(十)
11. INSTRUMENTS调试工具的使用(十一) —— 简介(一)
12. INSTRUMENTS调试工具的使用(十二) —— 通常任务之启动Instruments(一)
13. INSTRUMENTS调试工具的使用(十三) —— 通常任务之简单了解Instruments(二)
14. INSTRUMENTS调试工具的使用(十四) —— 通常任务之创建、保存和打开跟踪文档(三)
15. INSTRUMENTS调试工具的使用(十五) —— 通常任务之指定目标应用和设备(四)
16. INSTRUMENTS调试工具的使用(十六) —— 通常任务之访问和使用个别仪器(五)
17. INSTRUMENTS调试工具的使用(十七) —— 通常任务之记录、暂停和停止跟踪(六)
18. INSTRUMENTS调试工具的使用(十八) —— 导航收集的数据之关于数据分析(一)
19. INSTRUMENTS调试工具的使用(十九) —— 导航收集的数据之导航时间轴窗格(二)
20. INSTRUMENTS调试工具的使用(二十) —— 导航收集的数据之导航详细面板(三)
21. INSTRUMENTS调试工具的使用(二十一) —— 导航收集的数据之将数据映射到源代码(四)
22. INSTRUMENTS调试工具的使用(二十二) —— 导航收集的数据之查看您应用的源代码(五)
23. INSTRUMENTS调试工具的使用(二十三) —— 分析你App的性能之测量CPU使用情况(一)
24. INSTRUMENTS调试工具的使用(二十四) —— 分析你App的性能之测量图形性能(二)
25. INSTRUMENTS调试工具的使用(二十五) —— 分析你App的性能之监视网络和文件I / O(三)
26. INSTRUMENTS调试工具的使用(二十六) —— 分析你App的内存使用之关于内存分析(一)
27. INSTRUMENTS调试工具的使用(二十七) —— 分析你App的内存使用之检测内存使用(二)
28. INSTRUMENTS调试工具的使用(二十八) —— 分析你App的内存使用之找到废弃的内存(三)
29. INSTRUMENTS调试工具的使用(二十九) —— 分析你App的内存使用之找到内存泄露(四)
30. INSTRUMENTS调试工具的使用(三十) —— 分析你App的内存使用之找到僵尸对象(五)
31. INSTRUMENTS调试工具的使用(三十一) —— 分析你App的能源之测量能源影响(一)
32. INSTRUMENTS调试工具的使用(三十二) —— 高级任务之导出和导入跟踪数据(一)

Create Custom Instruments - 创建自定义Instruments

内置的Instruments提供了大量关于应用程序内部工作的信息。 但是,有时候,您可能希望将这些信息更贴近您自己的代码。 例如,不是每次调用函数时收集数据,您可能在收集数据时设置条件。 或者,您可能想要深入研究自己的代码,而不是内置instruments允许的代码。

重要:只要有可能,建议您使用现有仪器,而不是创建新仪器。 创建自定义instruments是一项高级功能。


About Custom Instruments - 关于自定义Instruments

自定义工具使用DTrace进行它们的行为。 DTrace是最初由Sun创建并移植到OS X的动态跟踪工具。由于DTrace分入操作系统内核,它允许您访问有关内核本身以及计算机上运行的用户进程的低级信息。许多内置仪器已经基于DTrace。 DTrace本身就是一个复杂的工具,但Instruments提供了一个简单的界面,使您可以在不复杂的情况下访问DTrace的强大功能。

DTrace尚未被移植到iOS,因此无法为运行iOS的设备创建自定义instruments

重要:尽管定制仪器生成器简化了创建DTrace探测器的过程,但在创建新仪器之前,您仍然应该熟悉DTrace及其工作原理。许多更强大的调试和数据收集操作都要求您编写DTrace脚本。要了解DTrace和D脚本语言,请参阅Oracle Technology Network提供的Solaris Dynamic Tracing Guide。有关dtrace命令行工具的信息,请参阅dtrace(1) Mac OS X Manual Page

注意:若干Apple应用程序(即iTunes,DVD Player和使用QuickTime的应用程序)可防止通过DTrace(临时或永久)收集数据,以保护敏感和受版权保护的数据。因此,在执行全系统数据收集时不要运行这些应用程序。

自定义仪器是使用DTrace探头构建的。探针就像您放在代码中的传感器。它对应于DTrace可以绑定的位置或事件,例如函数入口点。当函数执行或事件生成时,关联的探测器会触发,并且DTrace将运行与探针关联的任何操作。大多数DTrace操作仅收集有关操作系统和用户应用程序行为的数据。但是,可以将自定义脚本作为操作的一部分运行。使用脚本可以使用DTrace的功能来微调您收集的数据。

每遇到探头就会触发,但与探头相关的动作无需在每次探头触发时运行。谓词是一个条件语句,允许您限制探测器的操作何时运行。例如,您可以将探测器限制为特定的过程或用户,或者可以在仪器中的特定条件为真时运行操作。默认情况下,探头没有任何谓词,这意味着每次探测器触发时都会运行关联的动作。然而,您可以将任意数量的谓词添加到探针中,然后使用ANDOR运算符将它们链接在一起以创建复杂的决策树。

自定义instrument由以下块组成:

  • 说明块,包含仪器的名称,类别和说明
  • 一个或多个探针,每个探针都包含相关的动作和谓词
  • 数据声明区域,用于可选地声明由所有探针共享的全局变量
  • 开始脚本,可以选择初始化全局变量并执行仪器所需的启动任务
  • 结束脚本,可以选择执行最终的清理操作

自定义仪器必须至少具有一个与相关操作绑定的探针。同样,自定义工具应具有适当的名称和描述,以将其标识给Instruments用户。仪器在库调色板中显示此描述性信息。提供良好的信息可以让您更轻松地记住仪器的功能以及应该如何使用。

探针不需要具有全局数据声明或开始和结束脚本。当您想在探针之间共享数据或为仪器提供某种初始配置时,这些元素用于高级仪器设计。在 Write Custom Scripts中描述了创建数据,开始和结束块。


Create a Custom Instrument - 创建一个自定义仪器

要创建自定义DTrace仪器,请选择Instrument > Build New Instrument。 该命令显示仪器配置对话框,如图25-1所示。 您可以使用此表来指定您的仪器信息,包括任何探针和自定义脚本。

至少为您创建的每个自定义instrument提供以下信息:

  • Name - 名称。与您的自定义instrument在库中关联的名称。
  • Category - 类别。仪器出现在库中的类别。您可以指定现有类别的名称(例如Memory)或创建您自己的类别。
  • Description - 描述。仪器说明,用于库调色板和仪器的工具提示中。
  • Probe provider - 探针提供者。探测器类型和应该何时触发的细节。通常,这涉及指定探针所应用的方法或功能。请参阅Specify the Probe Provider
  • Probe action - 探测行动。探针触发时要记录的数据或要执行的脚本,请参阅Add Actions to a Probe

仪器应至少包含一个探针,并可能包含多个探针。探针定义由提供者信息,谓词信息和操作action组成。所有探针都必须至少指定提供者信息,并且几乎所有探针都定义了某种操作。探头定义的谓词部分是可选的,但是可以将您的仪器聚焦到正确的数据上,这是一个非常有用的工具。

1. Add and Delete Probes - 添加和删除探针

每台新仪器都带有一个可配置的探头。 要添加更多探针,请单击仪器配置对话框底部的添加按钮(+)。 见图25-2。

要从仪器中移除探针,请单击探针将其选中,然后单击仪器配置对话框底部的移除按钮( - )。

Figure 25-2 Adding or removing probes in the instrument configuration dialog

添加探针时,最好为探针提供一个描述性名称。 默认情况下,Instruments为每个探针分配一个按顺序编号的名称,例如Probe 1Probe 2

2. Specify the Probe Provider - 指定探针提供者

要指定触发探针的位置点或事件,请将相应的提供程序与探针相关联。 提供者是充当DTrace代理的内核模块,提供创建探针所需的工具。 您不需要知道提供者如何操作来创建工具,但您确实需要了解每个提供者的基本功能。 表25-1列出了Instrument应用程序支持并可用于自定义仪器的提供程序。Provider列出了仪器配置对话框中显示的名称,而DTrace provider列列出了相应DTrace脚本中使用的提供程序的实际名称。

Table 25-1 DTrace providers

Provider DTrace provider Description
User Process pid 探针触发代码中指定函数的输入(或返回)。 您必须提供函数名称和包含它的库的名称。
Objective-C objc 探针触发指定的Objective-C方法的入口(或返回)。 您必须提供它所属的方法名称和类别。
System Call syscall 探针触发指定系统库函数的输入(或返回)
DTrace DTrace 探测器在DTrace自身进入Begin, End, 或者 Error块时触发。
Kernel Function Boundaries fbt 探测器触发代码中指定的内核函数的入口(或返回)。 您必须提供内核函数名称和包含它的库的名称
Mach mach_trap 探针在指定的Mach库函数进入(或返回)时触发
Profile profile 探测器在机器的每个核心上按指定的时间间隔定期启动。 Profile探测器可以以范围从几微秒到几天的粒度进行触发
Tick tick 探头在机器的一个内核上定期触发。 Tick探测器可以以从几微秒到几天的粒度进行触发。 您可以使用此提供程序者执行不需要位于特定内核上的定期任务
I/O io 探针在指定的内核例程开始时触发。 有关此探测器监视的功能列表,请使用终端上的dtrace -l命令获取探测点列表。 然后,您可以搜索此列表以查看由io模块监视的探针
Kernel Process proc 探针触发在几个内核级例程之一的启动。 有关此探测器监视的功能列表,请使用终端上的dtrace -l命令获取探测点列表。 然后您可以搜索该列表以查看proc模块监视的功能
User-Level Synchronization plockstat 探测器触发几个同步点之一。 您可以使用此提供者来监视互斥锁和读写锁定事件
CPU Scheduling sched CPU调度事件发生时探针触发

为您的探针选择提供者后,指定探针所需的信息。 例如,对于某些函数级别的探测器,提供者可能需要函数或方法名称,以及代码模块或包含模块的类。 其他提供者可能只需要您从弹出式菜单中选择适当的事件。

配置好探针后,可以向其添加其他谓词(以确定何时应该触发),或者可以继续为该探针定义操作。

3. Add Predicates to a Probe - 将谓词添加到探针

通过Predicates可以控制何时由仪器执行探测器的操作。 您可以使用谓词来防止仪器在您不需要时收集数据或认为数据可能是错误的。 例如,如果您的代码仅在堆栈达到特定深度时才会出现异常行为,请使用谓词来指定最小目标堆栈深度。 每次探测器触发时,仪器都会评估相关的谓词。 只有当它们评估为真时,DTrace才会执行相关的操作。

To add a predicate to a probe - 将谓词添加到探针

  • 1)点击探测条件中的添加按钮(+)。
  • 2)选择谓词的类型。
  • 3)定义谓词值。

您可以使用探针或谓词的添加按钮(+)添加后续谓词。要删除谓词,请单击谓词旁边的删除按钮( - )。

仪器按照它们出现的顺序从上到下评估谓词。要重新排列谓词,请单击谓词的行并将其拖到表中的新位置。您可以使用ANDOR运算符链接谓词,但不能将它们分组以创建嵌套条件块。相反,请仔细排列谓词以确保检查适当的条件。

使用谓词行中的第一个弹出菜单来选择要检查的数据作为条件的一部分。表25-2列出了您可以在谓词或脚本代码中使用的由DTrace定义的标准变量。Variable列列出了仪器配置面板中显示的名称,DTrace variable列列出了相应DTrace脚本中使用的变量的实际名称。除了测试标准变量外,还可以通过在谓词字段中指定自定义变量类型来测试脚本代码中的自定义变量和常量。

Table 25-2 DTrace variables

Variable DTrace variable Description
Caller caller 进入探测器之前当前线程程序计数器的值。 这个变量包含一个整数值
Chip chip 执行探测的物理芯片的标识符。 这是一个基于0的整数,指示当前内核的索引。 例如,一个四核机器的核心从0到3
CPU cpu 执行探测的CPU的标识符。 这是一个基于0的整数,指示当前内核的索引。 例如,一个四核机器的核心从0到3
Current Working Directory cwd 当前进程的当前工作目录。 该变量包含一个字符串值
Last Error # errno 最近一次系统调用在当前线程上返回的错误值。 这个变量包含一个整数值
Executable execname 传递给exec以执行当前进程的名称。 该变量包含一个字符串值
User ID uid 当前进程的user ID,改变量包含一个整数值
Group ID gid 当前进程的group ID,改变量包含一个整数值
Process ID pid 当前进程的process ID,改变量包含一个整数值
Parent ID ppid 父进程的process ID,改变量包含一个整数值
Interrupt Priority Level ipl 探针触发时当前CPU的中断优先级。 该变量包含一个无符号的整数值
Function probefunc 探针描述的函数名称部分。 该变量包含一个字符串值
Module probemod 探针描述的模块名称部分。 该变量包含一个字符串值
Name probename 探针描述的名称部分。 该变量包含一个字符串值
Provider probeprov 探针描述的提供者名称部分。 该变量包含一个字符串值
Root Directory root 进程的根目录,该变量包含一个字符串值
Stack Depth stackdepth 当前线程在线程启动时的堆栈帧深度。 该变量包含一个无符号的整数值。
User Stack Depth ustackdepth 线程触发时当前线程的用户帧(忽略内核模式帧)的堆栈帧深度。 该变量包含一个无符号的整数值
Relative Timestamp timestamp 系统时间戳计数器的当前值,以纳秒为单位。 由于此计数器从过去的任意点递增,因此仅使用它计算相对时间差。 该变量包含一个无符号的64位整数值
Virtual Timestamp vtimestamp 当前线程运行的时间量,以纳秒为单位。 此值不包括在DTrace谓词和操作中花费的时间。 该变量包含一个无符号的64位整数值
Timestamp walltimestamp/1000 自00:00通用时间(1970年1月1日)以来经过的当前纳秒数。此变量包含一个无符号的64位整数值
arg0 through arg9 arg0 through arg9 探针的前10个参数,以原始64位整数表示。 如果向探针传递的参数少于十个,则其余变量包含值0。
Custom The name of your variable 使用此选项可以从一个脚本中指定变量或常量。

除了指定要检查的变量外,还必须指定一个比较运算符(等于,不等于,etc)以及用于与变量进行比较的值。

4. Add Actions to a Probe - 将操作添加到探针

当您的仪器定义的探测点被击中并且探测的谓词条件评估为真时,DTrace将运行与探测相关的操作。您可以使用探针的操作来收集数据或执行其他处理。例如,如果您的探针监视特定的函数或方法,则可以让该函数的调用方和任何堆栈跟踪信息返回到Instruments。如果您想要稍微更高级的操作,可以使用脚本变量来跟踪调用该函数的次数并报告该信息。如果您想要更高级的操作,可以编写一个使用内核级DTrace函数的脚本来确定函数使用的锁的状态。在后一种情况下,您的脚本代码也可能会返回锁的当前所有者(如果有的话),以帮助您确定代码的不同线程之间的交互。

图25-3显示了仪器配置对话框的指定探头操作的部分。脚本部分仅包含一个文本字段,供您输入脚本代码。 (在将代码传递给DTrace之前,仪器不会验证您的代码,因此请仔细检查您的代码。)底部部分包含用于指定要DTrace返回到仪器的数据的控件。您可以使用弹出菜单来配置要返回的内置DTrace变量。当第一个弹出菜单设置为Record时,可以选择从第二个弹出式菜单中选择Custom并返回其中一个脚本变量。

Figure 25-3 Configuring a probe’s action

当您将仪器配置为返回自定义变量时,Instruments会要求您提供以下信息:

  • 包含数据的脚本变量
  • 应用于仪器界面中的变量的名称
  • 变量的类型

您的探针返回到仪器的任何数据都会收集并显示在仪器的详细信息窗格中。详细信息窗格显示所有数据变量,而不管类型。如果堆栈跟踪信息可用于特定探针,仪器会在仪器的检查器窗格的扩展详细信息区域中显示该信息。另外,Instruments会自动查找仪器返回的整数数据类型,并将这些类型添加到仪器可以在跟踪窗格中显示的统计数据列表中。

因为DTrace脚本在内核空间中运行,并且Instruments应用程序在用户空间中运行,所以如果要将基于自定义指针的脚本变量的值返回给Instruments,则必须创建一个缓冲区来保存变量的数据。创建缓冲区的最简单方法是使用DTrace中的copyincopyinstr子例程。 copyinstr子例程接受一个指向C字符串的指针,并以可返回到Instruments的形式返回该字符串的内容。同样,copyin子例程接受一个指针和size值,并向数据返回一个缓冲区,稍后您可以使用stringof关键字将其格式化为一个字符串。这两个子例程都是DTrace环境的一部分,可以从探测器操作定义的任何部分使用。例如,要从C风格的字符串指针返回字符串,只需使用copyinstr子例程封装变量名称,如图25-4所示。

Figure 25-4 Returning a string pointer

重要:如果变量类型设置为string,仪器会自动将内置变量(如arg0arg9函数参数)与调用copyinstr包装在一起。 但是,Instruments不会自动包装脚本的自定义变量。 您有责任确保自定义变量中的数据实际上与为该变量指定的类型匹配。

有关仪器支持的内置变量列表,请参阅Table 25-2。 有关脚本和脚本变量的更多信息,请参阅Write Custom Scripts。 有关DTrace子例程(包括copyincopyinstr子例程)的更多信息,请参阅 Oracle Technology Network提供的Solaris Dynamic Tracing Guide


Write Custom Scripts - 写自定义脚本

您使用D脚本语言编写DTrace脚本,其语法源自C编程语言的大部分子集。 D语言将C语言的编程结构与一组特殊的函数和变量相结合,以帮助您跟踪应用程序中的信息。

以下各节介绍在自定义instruments中使用脚本的常用方法。这些部分不提供D语言的全面概述或编写DTrace脚本的过程。有关脚本和D语言的信息,请参阅Oracle Technology Network提供的Solaris Dynamic Tracing Guide

1. Write Begin and End Scripts - 编写开始和结束脚本

如果您想要做的不仅仅是当您的操作触发时将DTrace内置变量中的信息返回给Instruments,则需要编写自定义脚本。脚本在内核级与DTrace直接交互,提供对内核和活动进程的低级信息的访问。大多数仪器使用脚本来收集DTrace中不容易获得的信息。在将其返回给Instruments之前,您还可以使用脚本来处理原始数据。例如,如果您想让图形化的值与Instruments轨道窗格中的其他值进行比较,可以使用脚本将数据值标准化到特定的范围。

在仪器中,自定义仪器配置对话框提供了几个可编写DTrace脚本的区域:

  • 数据部分包含您想要在仪器中使用的任何全局变量的定义。
  • 开始部分包含仪器的任何初始化代码。
  • 每个探针都包含脚本代码作为其操作的一部分。
  • 结束部分包含仪器的清理代码。

所有脚本部分都是可选的。如果你的仪器不需要它们,你不需要有初始化脚本或清理脚本。但是,如果您的仪器在其Data部分中定义了全局变量,则建议您还提供初始化脚本以将这些变量设置为已知值。 D语言不允许您为您的全局变量声明内联赋值,因此您必须将这些赋值放在Begin部分。例如,简单的数据部分可能由单个变量声明组成,如下所示:

int myVariable;

然后相应的Begin部分将包含以下代码以初始化该变量:

myVariable = 0;

如果相应的探针操作更改myVariable的值,则可以使用探针的End部分来格式化并打印出变量的最终值。

大多数脚本代码可能与单个探针相关联。每个探测器可以有一个与其动作相关的脚本。当需要执行探测动作时,DTrace首先运行您的脚本代码,然后将所有请求的数据返回给Instruments。由于将数据传回仪器涉及将数据从内核空间复制回仪器应用程序空间,因此应始终通过在仪器配置对话框的Record the following data部分中配置适当的条目将数据传回仪器。从脚本代码手动返回的变量可能无法正确返回到Instruments

2. Access Kernel Data from Custom Scripts - 从自定义脚本访问内核数据

因为DTrace脚本在系统内核中执行,所以他们可以访问内核符号。要在您的DTrace脚本中查看自定义工具中的全局内核变量和数据结构,请在变量的名称前加反引号字符(`)。反引号字符告诉DTrace在当前脚本之外寻找指定的变量。

Listing 25-1显示了一个示例动作脚本,它从avenrun内核变量中检索当前负载信息,并使用该变量计算系统的一分钟平均负载。如果使用Profile提供者创建探针,则可以让此脚本定期收集加载数据,然后在Instruments中绘制该信息。

Listing 25-1Accessing kernel variables from a DTrace script
this->load1a = `avenrun[0]/1000;
this->load1b = ((`avenrun[0] % 1000) * 100) / 1000;
this->load1 = (100 * this->load1a) + this->load1b;

3. Scope Variables Appropriately - 合理更改变量范围

由于缺少流量控制语句和希望将探测执行时间降至最低,DTrace脚本具有基本平坦的结构。 也就是说,您可以根据需要将DTrace脚本中的变量范围扩展到不同的级别。 表25-3列出了变量的范围级别以及在每个级别使用变量的语法。

Table 25-3 Variable scope in DTrace scripts

Scope Syntax example Description
Global myGlobal = 1; 全局变量由变量名称标识。 所有系统线程上的所有探测动作都可以访问此空间中的变量。
Thread self->myThreadVar = 1; 线程局部变量从self关键字中取消引用。 在同一个线程上运行的所有探测器操作都可以访问此空间中的变量。 您可以使用此作用域在当前线程的多次探测操作过程中收集数据。
Probe this->myLocalVar = 1; 探针局部变量使用this关键字取消引用。 只有当前运行的探针才能访问此空间中的变量。 通常,使用此作用域来定义在当前操作结束时希望内核清理的临时变量。

4. Find Script Errors - 找到脚本错误

如果其中一个自定义instruments的脚本代码包含错误,则当DTrace编译脚本时,instruments会在轨道窗格中显示错误消息。 仪器在跟踪文档中单击Record按钮后,但在跟踪实际开始之前报告错误。 错误消息内部是一个编辑按钮。 点击此按钮可打开仪器配置对话框,该对话框现在可识别带有错误的探针。


Export and Import DTrace Scripts - 导出和导入DTrace脚本

虽然仪器为收集跟踪数据提供了一个方便的界面,但有时使用DTrace直接收集跟踪数据更为方便。例如,如果您是系统管理员或正在编写自动化测试脚本,则您可能更愿意使用DTrace命令行界面启动进程并收集数据。使用命令行工具需要您编写自己的DTrace脚本,这可能会耗费时间并可能导致错误。如果你已经有一个或多个基于DTrace的instruments文件,你可以使用instruments产生DTrace脚本,这与您的跟踪文档中的仪器一样,都是相同的行为。

仪器支持仅为所有仪器基于DTrace的文档导出DTrace脚本。这意味着您的文档可以包含自定义instruments和一些内置instruments,例如库调色板中的文件系统相关和Core Data instruments。

To export a DTrace script - 导出DTrace脚本

  • 1)选择跟踪文档。
  • 2)选择File > DTrace Script Export
  • 3)输入DTrace脚本的名称。
  • 4)为DTrace脚本选择一个位置。
  • 5)点击保存。

DTrace Script Export命令将仪器的脚本命令放置在文本文件中,然后可以使用-s选项将其传递到dtrace命令行工具。例如,如果您导出名为MyInstrumentsScript.d的脚本,请使用以下命令从终端运行它:

sudo dtrace -s MyInstrumentsScript.d

注意:在大多数情况下,您必须拥有超级用户权限才能运行dtrace,这就是在前面的示例中使用sudo命令运行dtrace的原因。

从Instruments导出脚本的另一个优点(与手动编写脚本相反)是,在运行脚本之后,可以将结果数据导入到Instruments中并在其中查看。 从Instruments导出的脚本在DTrace输出的开头打印一个开始标记(带有文本dtrace_output_begin)。 要收集数据,只需从终端复制所有DTrace输出(包括开始标记)并将其粘贴到文本文件中,或者直接将输出从dtrace工具直接重定向到文件。 要在仪器中导入数据,请选择您生成原始脚本的跟踪文档,然后选择File > DTrace Data导入。

后记

本篇主要讲述了创建自定义Instruments,感兴趣的给个赞或者关注~~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容