Oracle Solaris Studio 12.2:线程分析器用户指南

1.4.1.1 校验代码以检测数据争用

为了在应用程序中检测数据争用,必须首先对代码进行校验以监视运行时的内存访问。可以在编译过程中在应用程序源代码级别校验代码,也可以通过对二进制代码运行其他工具在应用程序二进制代码级别校验代码。

源代码级别校验通过编译器完成,需要使用特殊选项。还可以指定优化级别以及要使用的其他编译器选项。由于编译器可以进行一些分析工作并校验较少的内存访问,因此源代码级别校验可使运行时速度更快。

源代码不可用时,可以使用二进制代码级别校验。有源代码时也可以使用二进制代码校验,但无法编译应用程序所使用的共享库。如果使用 discover 工具进行二进制代码校验,则可以校验二进制代码并可在所有共享库打开时校验所有这些共享库。

源代码级别校验

要在源代码级别进行校验,请使用特殊的编译器选项编译源代码:


-xinstrument=datarace

通过使用该编译器选项,将会对编译器生成的代码进行校验以便检测数据争用。

生成应用程序二进制代码时,还应使用 -g 编译器选项。该选项会导致生成额外数据,线程分析器通过该数据可以在报告数据争用时显示源代码和行号信息。

二进制代码级别校验

要在二进制代码级别进行校验,必须使用 discover 工具。如果二进制代码命名为 a.out,可以通过执行以下命令创建校验后的二进制代码 a.outi


discover -i datarace -o a.outi a.out

discover 工具在所有共享库打开时自动校验所有这些共享库(无论它们是静态链接到程序中的,还是通过 dlopen() 动态打开的)。缺省情况下,校验后的库副本会缓存到 $HOME/SUNW_Bit_Cache 目录中。

下面显示了一些有用的 discover 命令行选项。有关详细信息,请参见 discover(1) 手册页。

-o file

将校验后的二进制代码输出到指定文件名

-N lib

不校验指定的库

-T

不校验任何库

-D dir

将高速缓存目录更改为 dir

为了校验程序的二进制代码以检测数据争用,discover 工具要求在以下条件下编译输入的二进制代码:

如果使用编译器选项 -xbinopt=prepare 编译了二进制代码,可能也可以在基于 SPARC 的系统中运行的早期 Solaris 版本上使用 discover 工具。有关该编译器选项的信息,请参见 cc(1)、CC(1) 或 f95(1) 手册页。