JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:线程分析器用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  什么是线程分析器?它有什么作用?

2.  数据争用教程

2.1 数据争用教程源文件

2.1.1 获取数据争用教程源文件

2.1.2 prime_omp.c 的源代码

2.1.3 prime_pthr.c 的源代码

2.1.3.1 数据争用在 prime_omp.cprime_pthr.c 中的效果

2.2 如何使用线程分析器查找数据争用

2.2.1 检测代码

2.2.1.1 检测源代码

2.2.1.2 检测二进制代码

2.2.2 创建数据争用检测实验

2.2.3 检查数据争用检测实验

2.2.3.1 使用线程分析器查看数据争用实验

2.2.3.2 使用 er_print 查看数据争用实验

2.3 了解实验结果

2.3.1 prime_omp.c 中的数据争用

2.3.2 prime_pthr.c 中的数据争用

2.3.3 数据争用的调用堆栈跟踪

2.4 诊断数据争用的原因

2.4.1 检查数据争用是否为误报

2.4.2 检查数据争用是否为良性

2.4.3 修复错误而不是修复数据争用

2.4.3.1 修复 prime_omp.c 中的错误

2.4.3.2 修复 prime_pthr.c 中的错误

2.5 误报

2.5.1 用户定义的同步

2.5.2 由不同线程回收的内存

2.6 良性数据争用

2.6.1 用于查找质数的程序

2.6.2 用于检验数组值类型的程序

2.6.3 使用双检锁的程序

3.  死锁教程

A.  线程分析器可识别的 API

B.  有用提示

2.3 了解实验结果

本节介绍如何使用 er_print 命令行和线程分析器 GUI 显示检测到的每个数据争用的以下信息:

2.3.1 prime_omp.c 中的数据争用

要检查 prime_omp.c 中的数据争用,可以使用在2.2.2 创建数据争用检测实验中创建的实验之一。

要使用 er_print 显示 prime_omp_instr.er 实验中的数据争用信息,请键入以下命令。

% er_print prime_omp_inst.er

(er_print) 提示符下,键入 races 可看到类似如下的输出:

(er_print)races

Total Races:  2 Experiment:  prime_omp_inst.er

Race #1, Vaddr: 0x21ca8
      Access 1: Write, is_prime,
                       line 26 in "prime_omp.c"
      Access 2: Read,  is_prime,
                       line 23 in "prime_omp.c"
  Total Callstack Traces: 1

Race #2, Vaddr: (Multiple Addresses)
      Access 1: Write, main,
                       line 50 in "prime_omp.c"
      Access 2: Write, main,
                       line 50 in "prime_omp.c"
  Total Callstack Traces: 2
(er_print)

该程序的此次特定运行期间发生了两次数据争用。

要在线程分析器中打开 prime_omp_inst.er 实验,请键入以下命令:

% tha prime_omp_inst.er

以下屏幕抓图显示了在 prime_omp.c 中检测到的争用,如线程分析器所显示。

图 2-1 prime_omp.c 中检测到的数据争用

image:线程分析器窗口的屏幕抓图,显示了关于 prime_omp.c 数据争用的 "Races"(争用)标签。

prime_omp.c 中显示了两个数据争用:

使用线程分析器中的 "Dual Source"(双源)标签,可以同时看到与数据争用相关联的两个源代码位置。例如,在 "Races"(争用)标签中选择 prime_pthr.cRace #2(争用 2),然后单击 "Dual Source"(双源)标签。将会看到类似如下的内容。

图 2-2 prime_omp.c 中检测到的数据争用的源代码

image:线程分析器窗口的屏幕抓图,显示了关于 prime_omp.c 数据争用的 "Dual Source"(双源)标签。

提示 - 可能需要在每个源代码面板的标题上拖动鼠标才能看到 "Dual Source"(双源)标签左边界的 "Race Accesses"(争用访问)度量。


2.3.2 prime_pthr.c 中的数据争用

要检查 prime_pthr.c 中的数据争用,可以使用在2.2.2 创建数据争用检测实验中创建的实验之一。

要使用 er_print 显示 prime_pthr_instr.er 实验中的数据争用信息,请键入以下命令:

% er_print prime_pthr_inst.er

(er_print) 提示符下,键入 races 可看到类似如下的输出:

(er_print) races

Total Races:  4 Experiment:  prime_pthr_inst.er

Race #1, Vaddr: (Multiple Addresses)
      Access 1: Write, is_prime + 0x00000270,
                       line 27 in "prime_pthr.c"
      Access 2: Write, is_prime + 0x00000270,
                       line 27 in "prime_pthr.c"
  Total Callstack Traces: 2

Race #2, Vaddr: 0xffbfe714
      Access 1: Write, main + 0x0000025C,
                       line 60 in "prime_pthr.c"
      Access 2: Read,  work + 0x00000070,
                       line 40 in "prime_pthr.c"
  Total Callstack Traces: 1

Race #3, Vaddr: (Multiple Addresses)
      Access 1: Write, work + 0x00000150,
                       line 44 in "prime_pthr.c"
      Access 2: Write, work + 0x00000150,
                       line 44 in "prime_pthr.c"
  Total Callstack Traces: 2

Race #4, Vaddr: 0x21a90
      Access 1: Write, work + 0x00000198,
                       line 45 in "prime_pthr.c"
      Access 2: Write, work + 0x00000198,
                       line 45 in "prime_pthr.c"
  Total Callstack Traces: 2
(er_print)

该程序的此次特定运行期间发生了四次数据争用。

要在线程分析器中打开 prime_pthr_inst.er 实验,请键入以下命令:

% tha prime_pthr_inst.er

以下屏幕抓图显示了在 prime_pthr.c 中检测到的争用,如线程分析器所显示。请注意,这些争用与 er_print 所显示的争用相同。

图 2-3 prime_pthr.c 中检测到的数据争用

image:线程分析器窗口的屏幕抓图,显示了关于 prime_pthr.c 数据争用的 "Races"(争用)标签

prime_pthr.c 中显示了四个数据争用:

如果选择 Race #2(争用 2),然后单击 "Dual Source"(双源)标签,则会看到两个源代码位置,类似于以下屏幕抓图。

图 2-4 数据争用的源代码详细信息

image:线程分析器窗口的屏幕抓图,显示了 "Dual Source"(双源)标签。

Race #2(争用 2)的第一次访问位于第 60 行,显示在顶部面板中。第二次访问位于第 40 行,显示在底部面板中。源代码的左侧会突出显示 "Race Accesses"(争用访问)度量。此度量显示了该行上报告的数据争用访问总次数。

2.3.3 数据争用的调用堆栈跟踪

线程分析器的 "Races"(争用)标签中列出的每个数据争用还有一个或多个相关联的调用堆栈跟踪。这些调用堆栈显示了代码中导致数据争用的执行路径。单击调用堆栈跟踪时,右侧面板中的 "Race Details"(争用详细信息)标签会显示导致数据争用的函数调用。

图 2-5 "Races"(争用)标签(包含 prime_omp.c 的调用堆栈跟踪)

image:线程分析器窗口的屏幕抓图,其中显示的 "Race Details"(争用详细信息)标签包含了 prime_omp.c 中的数据争用的调用堆栈跟踪