跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris Studio 12.3:性能分析器 Oracle Solaris Studio 12.3 Information Library (简体中文) |
用 Java 编程语言所编写的应用程序的运行时性能失真和扩大
-h counter_definition_1...[, counter_definition_n]
无论程序使用何种编译器选项进行编译,您都可以为该程序收集和分析数据,但有些选项会影响能够在性能分析器中收集或查看的内容。以下几个小节介绍了在编译和链接程序时应考虑的问题。
要查看带注释的“源代码”和“反汇编”分析中的源代码以及“行”分析中的源代码行,就必须使用 -g 编译器选项(对于 C++ 来说为用于启用前端内联的 -g0)编译感兴趣的源文件,以生成调试符号信息。调试符号信息的格式可以是 DWARF2 或 stabs,由 -xdebugformat=(dwarf|stabs) 指定。缺省的调试格式是 dwarf。
要准备带有调试信息的编译对象来允许数据空间分析(当前仅适用于 SPARC 处理器),请通过指定 -xhwcprof 和任何级别的优化来进行编译。(目前,这种功能在未经过优化的情况下无法使用。要查看“数据对象”分析中的程序数据对象,也要添加 -g(对于 C++ 来说为 -g0)以获取全部符号信息。
对于一些 SPARC 处理器上的精确硬件计数器的内存空间分析,不需要使用 -xhwcprof 编译和优化。有关更多信息,请参见数据空间分析和内存空间分析。
用 DWARF 格式的调试符号生成的可执行文件和库会自动包括每个要素目标文件调试符号的副本。如果用 stabs 格式的调试符号生成的可执行文件和库是通过 -xs 选项(该选项将 stabs 符号保留在各个目标文件及可执行文件中)进行链接的,那么所生成的可执行文件和库中也会包括每个要素目标文件调试符号的副本。当您需要移动或删除目标文件时,包括这些信息尤为重要。使用可执行文件和库本身中的所有调试符号,可以更容易地将实验和与程序相关的文件移至新位置。
编译程序时,必须使用 -dn 和 -Bstatic 编译器选项打开动态链接。如果试图收集完全静态链接的程序的数据,则收集器会列显一条错误消息并且不收集数据。出现此错误的原因在于,当您运行收集器时,该收集器库也会像其他库一样动态装入。
请不要静态链接任何系统库。如果您执行了静态链接,则可能无法收集任何种类的跟踪数据。另外,请不要链接到收集器库 libcollector.so。
通常,collect 命令会为目标地址空间中的所有共享对象收集数据,而不管这些对象是在初始库列表中,还是使用 dlopen() 显式装入。但是,在某些情况下不会分析某些共享对象:
利用延迟装入调用目标程序时。在这种情况下,库不是在启动时装入的,并且不是通过显式调用 dlopen() 装入的,因此共享对象不包括在实验中,其中的所有 PC 将映射到 <Unknown> 函数。解决方法是设置 LD_BIND_NOW 环境变量,该设置可强制在启动时装入库。
使用 -B 选项生成可执行文件时。在这种情况下,通过专门针对 dlopen() 动态链接程序入口点的调用来动态装入对象,并且忽略 libcollector 插入。共享对象名称不包括在实验中,其中的所有 PC 将映射到 <Unknown>() 函数。解决方法是不使用 -B 选项。
如果使用在某一级别打开的优化来编译程序,编译器就可以重新安排执行顺序,这样就无须严格按照程序中行的顺序来执行程序。性能分析器可以分析在优化后的代码中收集的实验,但它在反汇编级别所显示的数据通常很难与初始源代码行相关联。此外,如果编译器执行尾部调用优化,则调用序列可能与预期的序列不同。有关更多信息,请参见尾部调用优化。