p 必须是下列值之一。
collect[:name]
在 –xprofile=use 时优化器收集并保存执行频率,以供将来使用。编译器生成可测量语句执行频率的代码。
name 是执行程序时存储配置文件数据的目录的可选名称。如果已指定,name 应该是 UNIX 绝对路径名。如果未指定 name,名为 program 的经过文件配置的程序的配置文件数据将存储在名为 program.profile 的目录中,该目录位于执行程序时的当前工作目录中。
在运行时,使用 –xprofile=collect:name 编译的程序会创建子目录 name.profile 来保存运行时反馈信息。数据将写入该子目录下的文件 feedback 中。可以使用环境变量 $SUN_PROFDATA 和 $SUN_PROFDATA_DIR 更改反馈信息的位置。有关更多信息,请参见交互 一节。
如果多次运行程序,那么执行频率数据会累积在 feedback 文件中;也就是说,以前运行的输出不会丢失。
如果在不同的步骤中进行编译和链接,应确保使用 -xprofile=collect 编译的任何目标文件也要使用 -xprofile=collect 进行链接。有关在编译时和链接时都必须指定的选项的完整列表,请参见3.3.3 编译时选项和链接时选项。
-xMerge -ztext -xprofile=collect 这三个选项不应该一起使用。-xMerge 强制将静态初始化的数据写入只读存储,而 -ztext 禁止只读存储中有与位置有关的符号重定位,-xprofile=collect 在可写存储中生成静态初始化的、与位置有关的符号重定位。
use[:name]
使用先前执行使用 –xprofile=collect 编译的程序时生成并保存在 feedback 文件中的执行频率数据来优化程序。
name 是要分析的可执行文件的名称。name 是可选的,如果没有指定,则假定为 a.out。
除了从 -xprofile=collect 更改为 -xprofile=use 的 -xprofile 选项之外,源文件和其他编译器选项必须与用于(创建了之后生成 feedback 文件的编译程序的)编译的源文件和编译器选项完全相同。编译器的相同版本必须既用于收集生成也用于使用生成。如果使用 -xprofile=collect:name 进行编译,则相同的程序名称 name 必须出现在优化编译中:-xprofile=use:name。
目标文件与其配置文件数据之间的关联依据的是使用 -xprofile=collect 编译目标文件时该文件的 UNIX 路径名。在某些情况下,编译器不会将目标文件与其配置文件数据相关联:由于以前没有使用 -xprofile=collect 编译目标文件,因此目标文件没有配置文件数据;程序中的目标文件未使用 -xprofile=collect 进行链接;从未执行过该程序。
如果先前使用 -xprofile=collect 在不同目录中编译了目标文件,而该目标文件与使用 -xprofile=collect 编译的其他目标文件共享一个公共基名,但却无法通过它们的包含目录名称进行唯一标识,编译器也会产生混淆。在这种情况下,即使目标文件有配置文件数据,使用 -xprofile=use 重新编译目标文件时,编译器也不能在 feedback 目录中找到该目标文件。
所有这些情况都能使编译器释放目标文件及其文件配置数据之间的关联。因此,如果目标文件有配置文件数据,但在指定了 -xprofile=use 时,编译器无法将其与目标文件的路径名关联,请使用 -xprofile_pathmap 选项标识正确的目录。请参见A.2.172 -xprofile_pathmap
tcov
使用新式 tcov 进行基本块覆盖分析。
此选项是 tcov 的新式基本块文件配置。它的功能与 –xa 选项类似,但可以正确收集在头文件中有源代码或利用 C++ 模板的程序的数据。代码重构与 -xa 选项的代码指令类似,但不再生成 .d 文件。相反却生成单一文件,并且该文件的名称是按照最后的可执行文件命名的。例如,如果程序在 /foo/bar/myprog.profile 之外运行,那么数据文件将存储在 /foo/bar/myprog.profile/myprog.tcovd 中。
运行 tcov 时,必须将其传递给 – x 选项,以强制其使用新式数据。如果未传递 -x,则缺省情况下 tcov 使用原来的 .d 文件,并生成意外的输出。
与 –xa 选项不同,环境变量 TCOVDIR 在编译时无效。不过,在程序运行时可以使用环境变量的值。
–xprofile=tcov 和 -xa 选项在单个可执行文件中兼容。也就是说,可以链接同时包含了用 -xprofile=tcov 编译的某些文件和用 -xa 编译的另外一些文件的程序。您不能同时用这两个选项来编译同一个文件。
如果因使用 -xinline 或 -xO4 而内联函数,那么 -xprofile=tcov 生成的代码覆盖报告不可靠。
可以设置环境变量 $SUN_PROFDATA 和 $SUN_PROFDATA_DIR 控制使用 -xprofile=collect 编译的程序放置配置文件数据的位置。如果未设置这些变量,配置文件数据就写入当前目录中的 name.profile/feedback(name 是可执行文件的名称或在 -xprofile=collect:name 标志中指定的名称)。如果设置了这些变量,-xprofile=collect 数据就写入 $SUN_PROFDATA_DIR/$SUN_PROFDATA。
环境变量 $SUN_PROFDATA 和 $SUN_PROFDATA_DIR 同样控制 tcov 生成的配置文件数据文件的路径和名称。有关更多信息,请参见 tcov(1) 手册页。
如果在不同的步骤中进行编译和链接,则编译命令和链接命令中都必须有相同的 -xprofile 选项。虽然只在一个步骤中包括 -xprofile 而在其他步骤中不包括该项不会影响程序的正确性,但这样将无法进行文件配置。
在 Linux 平台上,-xprofile=collect 或 -xprofile=tcov 不应该与 -G 一起使用来生成共享库。
-xa、tcov(1) 手册页和《程序性能分析工具》。