Oracle® Developer Studio 12.5:性能分析器

退出打印视图

更新时间: 2016 年 6 月
 
 

编译和链接程序

无论程序使用何种编译器选项进行编译,您都可以为该程序收集和分析数据,但有些选项会影响能够在性能分析器中收集或查看的内容。以下几个小节介绍了在编译和链接程序时应考虑的问题。

针对源代码分析进行编译

要在带注释的 "Source"(源)和 "Disassembly"(反汇编)视图中查看源代码以及在 "Lines"(行)视图中查看源代码行,就必须使用 -g 编译器选项(对于 C++ 来说为用于启用前端内联的 -g0)编译感兴趣的源文件,以生成调试符号信息。 调试符号信息的格式为 DWARF2,该格式由 -xdebugformat=dwarf 指定。 这是缺省值。

用 DWARF 格式的调试符号生成的可执行文件和库会自动包括每个要素对象文件调试符号的副本。如果用 stabs 格式的调试符号生成的可执行文件和库是通过 –xs 选项(该选项将 stabs 符号保留在各个对象文件及可执行文件中)进行链接的,那么所生成的可执行文件和库中也会包括每个要素对象文件调试符号的副本。当您需要移动或删除对象文件时,包括这些信息尤为重要。使用可执行文件和库本身中的所有调试符号,可以更容易地将实验和与程序相关的文件移至新位置。

程序可使用 Oracle Developer Studio 编译器或 GNU 编译器进行编译。但是,GNU 编译器无法支持某些功能,如使用 OpenMP 重构的调用堆栈。

在 Oracle Developer Studio 编译器中,使用 -g 编译不会更改优化,O2O3 优化级别的尾部调用优化除外。

支持 Java 代码的源代码级信息。与本机语言不同,在实验中不会记录 Java 源代码的位置。您可能需要使用路径映射或者设置搜索路径来指向源代码。有关更多信息,请参见工具如何查找源代码

针对数据空间和内存空间分析进行编译

数据空间分析将内存访问归属到数据结构元素。要启用数据空间分析,必须使用 Oracle Developer Studio 编译器和 -xhwcprof 选项编译 C、C++ 和 Fortran 可执行文件。如果不使用该选项进行编译,则 "DataObjects"(数据对象)和 "DataLayout"(数据布局)视图不会显示二进制文件的数据。

内存空间分析允许您查看哪些内存地址消耗的性能最多。在针对内存空间分析准备程序时不需要使用特殊编译器选项,但只能在运行 Oracle Solaris 10 1/13 的 SPARC 平台以及运行 Oracle Solaris 11.2 的 Intel 平台上使用此功能。有关更多信息,请参见数据空间分析和内存空间分析

静态链接

对于某些类型的性能数据,如堆跟踪和 I/O 跟踪,数据收集依赖于动态链接的 libc。静态链接时,此功能无法使用,因此不应在使用 Oracle Developer Studio 编译器时使用 -dn-Bstatic 等选项来控制 libc

如果试图收集完全静态链接的程序的数据,则收集器会输出一条错误消息且不会收集数据。出现此错误的原因在于,当您运行收集器时,收集器库也会像其他库一样动态装入。

请不要静态链接任何系统库或收集器库 libcollector.so

共享对象处理

通常,collect 命令会为目标地址空间中的所有共享对象收集数据,而不管这些对象是在初始库列表中,还是使用 dlopen() 显式装入。但是,在某些情况下不会分析某些共享对象:

  • 利用延迟装入调用目标程序时。在这样的情况下,库不是在启动时装入的,并且不是通过显式调用 dlopen() 装入的,因此共享对象可能不包括在实验中,其中的所有 PC 将映射到 <Unknown> 函数。解决方法是设置 LD_BIND_NOW 环境变量,该设置可强制在启动时装入库。

  • 使用 –B direct 选项生成可执行文件时。在这种情况下,通过专门针对 dlopen() 动态链接程序入口点的调用来动态装入对象,并且忽略 libcollector 插入。共享对象名称可能不包括在实验中,其中的所有 PC 将映射到 <Unknown>() 函数。解决方法是不使用 –B direct 选项。如果程序正常终止,则会检测到并记录此类共享对象。

编译时优化

如果在某一级别启用优化的情况下编译程序,编译器就可以重新安排执行顺序,这样就无须严格按照程序中行的顺序来执行程序。 性能分析器会分析从优化后的代码中收集的实验,但它在反汇编级别所显示的数据通常很难与初始源代码行相关联。此外,如果编译器执行尾部调用优化,则调用序列可能与预期的序列不同。有关更多信息,请参见尾部调用优化

编译 Java 程序

javac 命令编译 Java 程序无需任何特殊操作。