Oracle® Developer Studio 12.5:发行说明

退出打印视图

更新时间: 2016 年 6 月
 
 

此发行版中的已知问题、限制和解决方法

本节介绍此 Oracle Developer Studio 12.5 发行版的部分已知问题,并提供有关如何解决这些问题的信息。

编译器问题

本节介绍此发行版中编译器的已知问题、问题和解决方法。

编译器共有的问题

本节介绍适用于 ccCCf95 编译器的已知问题。

使用保留处理器的 OpenMP 处理器绑定问题

OpenMP 处理器绑定不遵守在 Linux 上使用 taskset 命令的处理器保留。

x86 编译器

使用编译行中的标志 –xarch=amdsse4a–msse4a 生成可执行程序,然后运行此程序,它会导致不支持 ISA sse4a 的处理器(例如,Intel 处理器)出现分段故障。

–xtarget=S7–xchip=S7 选项

编译器驱动程序支持 –xtarget=S7–xchip=S7 选项,但是在编译器手册页中未说明它们。

C++ 编译器问题

本节介绍此发行版中 C++ 编译器的已知问题、问题和解决方法。

编译 BOOST 库问题

不是所有 BOOST 库都可成功地进行编译。获得的结果可能与所用的 BOOST 版本以及库使用方式有关。BOOST 库包括在 Oracle Developer Studio 编译器中;正在进行测试和改进以实现编译所有 BOOST。如果运行中遇到无法继续的问题,请报告该问题。

Oracle Solaris 上的 Apache 标准库问题

Oracle Solaris 10 8/11 及更高版本中以及在 Oracle Solaris 11、11.1 和 11.2 的初始发行版中安装的 Apache stdcxx 库无法正确使用新编译器缺省设置 –template=no%extdef。可能需要将选项 –template=extdef 添加到使用此库的 CC 命令行中。在 Oracle Solaris 11.3 SRU2 中已修复此问题。当前未提供对 Oracle Solaris 10 的修复。有关更多信息,请参见《Understanding the Effects of the Changed Default C++ Template Compilation Model》(《了解更改后的缺省 C++ 模板编译模式的效果》)。

Oracle Solaris 10 8/11 中安装的 Apache stdcxx 库在头 stdcxx4/loc/_moneypunct.h 中有语法错误。较早版本的编译器没有发现此错误,此错误是由 Oracle Developer Studio 12.5 C++ 编译器造成的。无法禁用错误检测。


注 -  该语法错误问题已在 Oracle Solaris 10 1/13 和 Oracle Solaris 11.1 中修复。
多义性:构造函数调用或指向函数的指针

某些 C++ 语句有可能解释成声明或者表达式语句。C++ 消除歧义规则为:如果一个语句可以处理成声明,那么它就是声明。

在 Oracle Solaris Studio 12.2 和更早版本中,编译器解释错误的情况如下:

          struct S {
            S();
          };
          struct T {
            T( const S& );
          };
          T v( S() );    // ???

编程人员也许本来打算在最后一行定义变量 v,并且用类型为 S 的临时变量对它进行初始化。早期版本的编译器会这样解释这条语句。

但是在声明环境里,构造符号 "S()" 也可以是抽象声明符(不带标识符),表示“没有返回值类型为 S 的参数的函数”。在这种情况下,该语句会自动转换为函数指针 "S(*)()"。这样该语句仍可作为函数 v 的声明,该函数有一个函数指针类型的参数,返回类型为 T 的值。

当前版本的编译器可以正确地解释该语句,但这未必是编程人员所需要的结果。

可以使用两种方法来修改上述代码以便不产生歧义:

          T v1( (S()) );  // v1 is an initialized object
          T v2( S(*)() ); // v2 is a function

第一行中另加的圆括号表明它不是 v1 作为函数声明的有效语法,所以它的唯一可能解释是“利用类型为 S 的临时值进行初始化的类型为 T 的目标”。

同样,构造符号 "S(*)()" 不可能是一个值,所以它的唯一可能解释是函数声明。

第一行也可以改写为:

T v1 = S();

虽然这时语句含义非常清楚,但这种形式的初始化有时会创建一个额外的临时变量,而一般情况下不会发生这种情况。

建议不要编写与下面语句类似的代码,因为它的含义不清楚,不同的编译器可能会提供不同的结果。

T v( S() ); // not recommended

名称改编链接问题

Oracle Developer Studio 在 –compat=5 模式下执行的名称改编具有错误。修复这些错误时会产生二进制文件不兼容性问题。在使用 –m64 的 x86/Oracle Solaris 上和 Linux 上,已在发行 Oracle Studio 之前发现并更正了错误,但在其他平台上仍存在。新选项 –abiopt=mangle6 更正了使用 –m32 选项的 sparc/Oracle Solaris 和 x86 Oracle Solaris 上的改编错误。

请参阅Oracle Developer Studio 12.5:C++ 用户指南 中的 –abiopt=[mangle5|mangle6]

不支持引用模板中的非全局名称空间目标

如果您使用 –instances=extern 编译,则使用模板和静态对象的程序会出现未定义符号的链接时错误。使用缺省设置 –instances=global 则不会出现问题。编译器不支持对模板中的非全局名称空间作用域目标的引用。请看以下示例:

      static int k;
      template<class T> class C {
              T foo(T t) { ... k ... }
      };

在本示例中,一个模板类的成员引用了静态名称空间作用域的变量。请记住,名称空间作用域包含文件作用域。编译器不支持模板类的成员引用静态名称空间作用域的变量。另外,如果模板在其他的编译单元实例化,那么每个实例都会指向不同的 k,这破坏了 C++ 一次定义规则,代码的行为将会不可预测。

下面的方法也是可行的,但这取决于您如何使用 k,以及它应有的功能。第二个选项仅可供属于类成员的函数模板使用。

  1. 可以为变量提供外部链接属性:

                  int k; // not static 

    所有的实例都使用同一个 k

  2. 也可以使这个变量成为类的静态成员:

                template<class T> class C {
                        static int k;
                        T foo(T t) { ... k ... }
                };	

    静态类成员具有外部链接属性。每个 C<T>::foo 的实例使用不同的 k。其他函数可以共享 C<T>::k 的实例。此选项可能是您需要的选项。

名称空间内的 #pragma align 需要改编名称

在名称空间内使用 #pragma align 时,必须使用改编名称。例如,在下面的代码中,#pragma align 语句是无效的。要更正此问题,应将 #pragma align 语句中的 abc 替换为其改编名称。

编译为 C++11 时,可以使用标准关键字 alignas 以避免 pragma 出现问题。

        namespace foo {
          #pragma align 8 (a, b, c) // has no effect
          //use mangled names: #pragma align 8 (__1cDfooBa_, __1cDfooBb_, __1cDfooBc_)
          static char a;
          static char b;
          static char c;
        }

C 编译器问题

本节介绍此发行版中 C++ 编译器的已知问题和问题。

标准宏 FLT_ROUNDS 行为

随 SPARC Linux 的 C 编译器提供的标准 C 宏 FLT_ROUNDS 的实现按照 C 标准指定的那样运行,并返回当前舍入模式的相应值。它并非像描述标准 C 头文件 fenv.h 中所定义函数的 SPARC Linux 手册页中指定的那样,始终返回值 1。

–xustr=ascii_utf16_ushort 选项与 –std=c11 不兼容

如果 –std=c11(编译器缺省选项)已生效,则指定标志 –xustr=ascii_utf16_ushort 会导致错误。

要避免错误,必须指定一个选项,将编译器接受的 C 语言变种更改为较早版本的 C 语言。建议使用的选项为 –std=c99–std=c89

如果使用以下更改 C 语言变种的任意选项,也会接受 –xustr=ascii_utf16_ushort 选项:–ansi–Xc–Xa–Xt–Xs

Fortran 编译器问题

本节介绍此发行版中 Fortran 编译器的已知问题和问题。

  • 不换行打印行末尾之前的空格不会影响输出位置。

    输出语句格式末尾的 X 编辑描述符不会影响输出记录中后续字符的位置。如果输出语句中有 ADVANCE='NO' 并且有更多字符要通过后续输出语句传送到同一记录,则会导致差异。

    在很多情况下,可以通过添加空白字符串编辑描述符,而不是 n X 编辑描述符来解决此问题。它们并不完全相同,因为空白字符串编辑描述符实际上会将空白字符包含在记录中,而 n X 仅跳过后 n 个字符,缺省情况下通常导致跳过的位置中产生空白。

  • 一行中有两个连续 & 号的有效代码会被拒绝。

    Fortran 标准禁止有一个 & 号的空续行。但是,仍可以创建同一行中有两个 & 号的空续行,这不在标准限制范围之内。编译器不会处理这种情况,而会显示一条错误消息。解决方法是删除该行,这只会影响程序可读性而并不添加任何语义。BOZ 常量有时会被截断。

  • 在某些相对更复杂的情况下,如数组构造,BOZ 常量可能会被截成 4 个字节的缺省整数大小,即使它所应指定给的相应项是一个 8 个字节的整数实体。解决方法是在数组构造中使用正确类型和种类的常量,而不要使用 BOZ 常量。

  • 更正新发行版中的舍入算法可能会导致列表控制的、名称列表控制的和格式化写入的 ROUND='NEAREST'ROUCH='COMPATIBLE' 的输出与以前发行版中的输出不同。该舍入差异应该仅在最低有效位上。

Fortran 填充值更改

与以前的发行版相比,使用 –pad=common 编译器选项生成的填充值在使用 Oracle Developer Studio 12.5 编译的代码中可能是不同的。如果使用 –pad=common 编译引用同一通用块的两个或更多文件,则必须使用同一 Oracle Developer Studio 发行版中的 f95 编译器编译它们。

Fortran 77 库已删除

需注意 Oracle Solaris Studio 12.2 发行版已删除了过时的 FORTRAN 77 库。这意味着使用依赖于共享库 libF77libM77 libFposix 的传统 Sun WorkShop f77 编译器编译的旧的可执行文件将不会运行。

数组内部函数使用全局寄存器

数组内部函数 OT_PRODUCTMATMUL 针对相应 SPARC 平台体系结构进行了高度优化。因此,它们使用全局寄存器 %g2%g3%g4 作为临时寄存器。

对于区间运算,还会影响数组内部函数 ANY、ALL、COUNT、MAXVAL、MINVAL、SUM、PRODUCT

如果调用了上述所列的数组内部函数,则用户代码不应该认为这些寄存器可用于暂时存储。当调用数组内部函数时,这些寄存器中的数据将被覆盖。

归档库中的 F95 模块不包括在可执行文件中

调试器 dbx 要求编译中使用的所有对象文件都包含在可执行文件中。通常,无需用户执行额外操作,程序即可满足此要求。但使用含有模块的归档文件时例外。如果程序使用了一个模块,但没有引用模块中的任何过程或变量,则产生的对象文件不会包含对模块中定义的符号的引用。只有对目标文件中定义的符号具有引用时,链接器才会链接归档文件中的对象文件。如果没有此类引用,则可执行文件中将不包括对象文件。dbx 将在尝试查找与所用模块关联的调试信息时发出警告。对于缺少调试信息的符号,则无法提供有关这些符号的信息。

使用 –u 链接程序选项可以解决这个问题。此选项使用一个符号作为其选项参数。它会将该符号添加到未定义的链接程序符号集中,这就需要解析此符号。与模块关联的链接程序符号通常是模块名称,其所有字母均为小写,后面跟有一条下划线。

例如,为了强制包含模块 MODULE_1 的对象文件被归档文件采用,请指定链接程序选项 –u module_1_。如果使用 f95 命令进行链接,请在命令行上使用 –Qoption ld –umodule_1_

Linux 平台上的 gethrtime(3F)

启用系统节能功能时,没有可靠方式可以精确地获得 AMD 处理器上的时钟速率。因此,使用基于 gethrtime(3F) 的计时函数(Fortran 编译器的 Linux 版 Oracle Solaris gethrtime(3C) 函数)在 Linux 平台上获得高精度实际时间的方法只有在禁用了节能功能的 AMD 系统上才会精确。要禁用节能功能,可能需要重新引导系统。

工具问题

本节列出了调试工具和性能分析工具的已知限制。

dbx 限制和不兼容情况

dbx 具有以下限制:

  • 使用 libC.so.5 或者 libC.so.4 的旧副本可能会在 C++ 异常区域中引起 dbx 问题。可能会出现关于错误的 stab 和未处理的异常等警告消息。

    解决方法:在所有系统上安装最新的 libC.so.5

  • Fortran 用户应该用 –stackvar 选项进行编译,以便充分利用运行时检查。

  • 某些程序可能无法正常使用 –stackvar 选项。在这样的情况下,请尝试使用 –C 编译器选项,它将在不使用运行时检查的情况下启用数组下标检查。

  • dbx 命令行解释器是旧版本的 Korn shell (ksh),不支持代码集独立 (Code Set Independence, CSI)。当在 dbx 命令行上键入多字节字符时,会发生解释错误。

  • Linux OS 上不能使用以下 dbx 功能:

    • 修复并继续

    • 多线程应用程序上的性能数据收集。

    • 美化输出

    • 在下列事件中设置断点:

      • fault

      • lastrites

      • lwp_exit

      • sysin

      • sysout

      • sync

    • 索引 DWARF(编译器选项 –xs=no

  • 在 Linux 平台上调试程序时可能会发生下面的问题:

    • 不支持 TLS 访问。

    • 要调试 32 位程序,必须使用 –x exec32 选项启动 dbx

    • Korn shell 中的管道操作符仅限于 Linux 平台。任何需要访问目标进程的 dbx 命令不能作为管道的一部分使用。例如,下面的命令可能会导致 dbx 挂起:

      where | head -1

      解决方法:

      • 按 Ctrl-C 组合键以显示新的 dbx 提示符。

      • dbx 可缓存大量信息,对于上述示例,下列命令序列会起作用:

        where
        where | head —1
      • 将命令输出重定向到文件,然后显示文件内容。

        (dbx) > bag where
        (dbx) cat bag
  • dbx 不支持 GNU C 和 C++ 编译器的下列功能:

    • VL 数组(gcc 4.1 及之前)

    • OpenMP

    • RTTI

    • 模板定义

    • 缺省参数

    • using 指令

    • friend

  • Oracle Linux 6 上的 dbx 存在以下问题:

    • 系统库中使用的间接引用符号有时会导致 dbx 在引用处不是实际函数处设置断点。

    • 在调试使用 gcc 4.4.4 编译器编译的代码时,请注意 dbx 看不到使用 –D 调试器选项定义的宏。

  • Oracle Developer Studio 支持调试信息的 stabs 格式,但 Oracle 已宣布可能最终将停用该格式以支持 DWARF 格式。Oracle 不需要为新增功能或现有功能的增强实施 stabs 支持。

    Stabs 格式不支持以下调试功能。

    • C++11 和 C++14 新增功能。

    • C11 新增功能

    • 优化后代码中的参数和局部变量。

    • 宏(当使用 –g3 选项编译代码时)。

    • 调试信息的子集(通常在使用 –xdebuginfo={...} 编译时)。

    • 面向对象的 Fortran

  • 有关将 dbx 连接到进程时的数据收集问题的信息,请参见dbx attach 分析 (collect -P)

  • 如果使用 GNU 运行时库,则对异常处理的调试支持是有限的。

性能分析器和 er_print 实用程序限制

本节介绍性能分析器工具和 er_print 实用程序的已知问题。

  • 性能分析器对 Java 7U65 崩溃。在使用性能分析器工具时,请至少使用 Java 7U75。

  • 共享对象的 "Library Visibility"(库可见性)功能有时无法与过滤正常配合使用。

  • 性能分析器和 er_print 找不到 jar 文件中嵌入的共享对象。此外,在有些情况下,性能分析器和 er_print 找不到 Java 类文件或源文件。要解决这些问题,请使用 addpath 指向包含相应文件的目录。有关更详细的信息,请参见性能分析器 "Help"(帮助)中的 "Troubleshooting"(故障排除)部分。

  • 在比较实验时,可能会看到以下问题:

    "Source"(源)和 "Disassembly"(反汇编)视图显示包含度量和独占度量,而不是如预期地仅显示包含度量。

  • 可能会看到与具有可变时钟速率的 CPU 相关的以下问题:

    • 在采用可变时钟速率的系统上,基于周期的计数器的硬件计数器分析度量在处理器以低于最大速率运行时会低报,并且度量会转换为时间。

    • 在采用了以不同时钟频率运行的多个 CPU 的系统上,将根据其中一个 CPU 的时钟速率处理实验,这可能导致对其他 CPU 的计数过多或不足。

  • 分析在 SPARC T5、M5 和 M6 系统上使用许多线程的 OpenMP 应用程序时,可能生成非常大而无法读取的实验。解决方法是在运行 collect 之前设置环境变量 SP_COLLECTOR_NO_OMP。请注意,在设置此变量时,无法在结果实验中看到 OpenMP 构造和度量,"User"(用户)、"Expert"(专家)和 "Machine"(计算机)视图全都看起来一个样。

在远程主机上分析应用程序的限制

尚不支持使用口令短语远程登录 。

collect 实用程序

本节介绍性能分析器工具的 collect 实用程序和数据收集的已知问题。

  • 通过 JDK 1.7.0_59 使用 JDK 1.7.0_40 时,由于 JDK 中存在错误,对混合了 Java 和 C++ 的应用程序的分析可能不完整。从 Java 到 C++ 的调用的堆栈未正确展开。

  • Linux 上的堆跟踪不跟踪对 calloc 的调用。

  • 收集计数数据 (collect -c) 对使用 –std=c++11 编译的二进制文件无效。

  • 由于 Oracle Solaris setitimer(ITIMER_REALPROF, ...) 中的错误所致,SPARC T4/T5 M5/M6 上的时钟分析可能具有不规则的样例。

  • 属性系统等于 1 的硬件计数器分析具有以下已知问题。有些系统时间可能未对 usleep() 正确计数。在 Oracle Solaris 10 上,使用系统属性可挂起应用程序。

  • 由于 Oracle Solaris 中的错误所致,时钟分析可能将 "User CPU Time"(用户 CPU 时间)错误地报告为 "Wait CPU Time"(等待 CPU 时间)

  • 通过内核区域中的分析信号,您可能会看到以下问题:

    • 内核区域中的时钟分析信号无规律地传送,从而导致数据丢失。

    • 硬件计数器 dtlb_misses.any 对 Westmere 内核区域不起作用

    • 内核区域不支持 x86 上的内存空间分析

    • 在 SPARC 上,硬件计数器分析样例可能延迟许多秒;丢失的样例将导致少计

    • 内核区域中的时钟分析样例可能报告错误的微观状态

    • 运行内核区域的系统控制域上的 HWC 分析样例可能丢失。

    • 内核区域上的 HWC 分析样例可能丢失。

  • 在 Linux 上分析 SPECJBB2015 会导致崩溃或挂起。

  • 堆栈展开的各种极端情况可能会在 x86 以及 Oracle Solaris 和 Linux 上失败

er_kernel 实用程序

本节介绍 er_kernel 实用程序的已知问题。

  • er_kernel 拒绝在运行于 Oracle VM 下的 Oracle Solaris 系统上运行,以避免会导致重新引导的 Oracle VM 错误

  • 调用堆栈有时可能会省略某个帧,通常出现在叶函数位于其尾声中时

  • 运行内核区域的系统控制域上的硬件计数器分析样例可能丢失。

  • 内核区域上的硬件计数器分析样例可能丢失。

  • 内核区域中使用 er_kernel 的硬件计数器分析可能仅支持单个硬件计数器

dbx collector 分析

本节介绍使用 dbx collector 命令时的应用程序分析问题。

  • 在 Java 上使用 dbx collector 有限制。无法为目标指定 Java 类文件。因此,必须指定 JVM 作为目标,并指定类文件作为 dbx run 命令的一个参数。例如:

    > dbx /path-to-your-jdk/bin/java
    (dbx) collector enable
    (dbx) collector java on
    (dbx) run [JVM-options] [Java-class-file-to-execute]
  • 在 Linux 上,使用 dbxcollect -P 分析任何 Java 应用程序都可能失败。

dbx attach 分析 (collect -P)

本节介绍使用 dbx attach 命令时的运行中应用程序分析问题:

  • 如果将 dbx 连接到正在运行且启动时未使用 LD_PRELOAD 预先装入收集器库 libcollector.so 的进程,则将发生一系列错误。无法收集任何跟踪数据:同步等待跟踪、堆跟踪、I/O 跟踪或 MPI 跟踪。跟踪数据是通过对各个库执行插入操作而收集的。如果没有预先装入 libcollector.so,将无法执行插入操作。

  • 如果在 dbx 连接到进程之前目标程序安装了信号处理程序,并且信号处理程序未在 Oracle Solaris 上传递 SIGPROF 和 SIGEMT 信号(或者未在 Linux 上传递 SIGIO 信号),则可能会丢失部分或全部分析数据。

  • 如果目标程序使用 libcpc.so,则硬件计数器实验可能会失败,这是因为收集器和程序都在使用该库。

  • 如果目标程序调用 setitimer(2),则由于收集器和程序同时使用计时器,可能会使时钟分析实验中断。

  • 连接到正在调用 malloc 库的目标可能导致目标失败。在连接时请求硬件计数器会极大地提高此类失败的概率。

  • 在 Linux 上,使用 dbxcollect -P 连接到 Java 程序可能会失败。

  • 在 Linux 上,连接到正在进行阻塞调用或非阻塞调用的目标可能导致目标失败。

  • 在 Linux 上,连接到多线程目标将不会正确记录在连接时已创建的线程的数据。不提供有关丢失数据的警告。请注意,其中包括所有 Java 目标,因为 JVM 是多线程的。

IDE 限制

本节介绍 IDE 中的已知限制。

要在远程主机上根据二进制文件创建项目,远程主机必须提供 Oracle Solaris Studio 12.3 或 12.4 或者 Oracle Developer Studio 12.5。较早的发行版不支持此功能。

代码分析工具限制

本节介绍代码分析工具的已知限制。

  • 如果未正确检测您的代码,则可能会发现误报或漏报。有关更多信息,请参见Oracle Developer Studio 12.5:Discover 和 Uncover 用户指南 中的 支持的二进制文件

  • 当程序大小(文本 + 数据)大到超过 –xmodel=small 的最大范围 (232 - 224 - 1) 时,discoveruncover 工具无法处理使用 –xmodel=medium 编译的 x86_64 二进制文件。

  • discover 工具对辅助文件无效;在 Oracle Solaris 11.3 中,辅助文件包含使用链接程序选项 –z ancillary 创建的调试信息。

  • 要在 Oracle Linux 上使用任何代码分析工具,都必须编译原始二进制文件并使用 –xannotate=[yes] 选项进行链接。

  • 要在支持 SSM 的计算机的内核区域中使用 "Discover SSM",则区域的配置应该包括 host-compatibile=native

Java 安装程序问题

本节介绍 Java 安装程序的已知问题、问题和解决方法。

racle Instant Client (OIC) 的安装

命令行、非交互模式 ./developerstudio.sh --non-interactive 将不安装 OIC 组件。

要避免此问题,用于安装的命令行、非交互模式必须在 –-install-components 选项之后一起指定 OIC 以及所有编译器和工具组件,如下所示:

./developerstudio.sh --non-interactive --install-components oic, dbxtool, code-analyzer-tool, performance-and-thread-analysis-tools, performance-library, c-and-cpp-compilers, dmake

此外,如果需要日语或中文语言环境,请将组件(用逗号分隔)japanese-localizationsimplified-chinese-localization 添加到 --install-components 行。