Oracle® Developer Studio 12.5:代码分析器教程

退出打印视图

更新时间: 2016 年 6 月
 
 

收集和显示数据

您可以使用代码分析器工具最多收集三种类型的数据。

收集和显示静态错误数据

使用 –xprevise 编译器选项生成二进制文件时,编译器会自动提取静态错误并将数据放入源代码所在目录中的 binary-name.analyze 目录的 static 子目录中。有关编译器找到的静态错误的类型列表,请参见静态代码问题

  1. sample 目录中,键入以下内容以生成应用程序:


    注 -  –xprevise 选项与 –xanalyze=code 同义,后者已弃用。
    • 在 Oracle Solaris 上:

      $ cc -xprevise main.c previse*.c sample1.c sample2.c sample3.c
    • 在 Oracle Linux 上:

      $ cc -xannotate -xprevise main.c previse*.c sample1.c sample2.c sample3.c

    注 -  教程的此部分无需编译 sample4.c

    静态错误数据将写入 sample/a.out.analyze/static 目录。

  2. 启动代码分析器 GUI 以查看结果:

    $ code-analyzer a.out &
  3. 此时将打开代码分析器 GUI,"Results"(结果)标签中会显示编译期间发现的静态代码问题。"Results"(结果)标签左上的文本指示发现了十三个静态代码问题。

    image:显示静态问题的代码分析器 “Results“(结果)标签

    对于每个问题,此标签显示问题类型、发现问题的源文件的路径名以及该文件中突出显示相关源代码行的代码片段。

  4. 要查看有关第一个问题("Double Freeing Memory"(双重释放内存)错误)的更多信息,请单击错误图标 image:错误图标

    此时将打开问题的堆栈跟踪,其中显示错误路径:

    image:显示错误路径的 “Double Freeing Memory“(双重释放内存)错误

    请注意,在打开堆栈跟踪时,问题的右上角的图标从 image:未访问的图标 变为 image:已访问的图标 ,指示您已经查看了该问题。


    注 -  通过单击 "Results"(结果)标签顶部的 "Reviewed"(已查看)按钮 image:隐藏已查看的问题按钮 ,可隐藏您已经查看的问题。再次单击此按钮可取消隐藏问题。
  5. 单击同一个错误图标以关闭堆栈跟踪。

  6. 单击某个 "Uninitialized Memory Read"(读取未初始化的内存)警告的堆栈跟踪警告图标 image:警告图标 可打开堆栈跟踪。

    此问题的错误路径所包含的函数调用远远多于 "Double Freeing Memory"(双重释放内存)问题的错误路径所包含的函数调用。

  7. 双击第一个函数调用。

    此时将打开源文件,并且突出显示该调用。错误路径显示在源代码下的 "Details Window"(详细信息窗口)中。

    image:突出显示函数调用并在下方显示错误路径的源代码窗口
  8. 双击错误路径中的其他函数调用以沿着路径找到导致错误的代码。

  9. 单击问题描述左边的信息按钮 image:信息按钮 可了解有关 UMR 错误类型的更多信息。

    联机帮助浏览器中显示了错误类型的描述,其中包括代码示例和可能的原因。

  10. 按右上角的 X 关闭代码分析器 GUI。

收集和显示动态内存使用情况数据

无论是否收集了静态数据,您都可以编译、检测和运行应用程序来收集动态内存访问数据。有关通过使用 discover 检测应用程序然后运行应用程序找到的动态内存访问错误的列表,请参见动态内存访问问题

  1. sample 目录中,使用 –g 选项生成样例应用程序。

    此选项可生成调试信息,从而使代码分析器可以显示错误和警告的源代码和行号信息。

    • 在 Oracle Solaris 上:

      $ cc -g main.c previse*.c sample1.c sample2.c sample3.c
    • 在 Oracle Linux 上:

      $ cc -xannotate -g main.c previse*.c sample1.c sample2.c sample3.c

    注 -  教程的此部分无需编译 sample4.c
  2. 请保存该二进制文件的副本以供收集覆盖数据时使用,因为无法检测已经检测的二进制文件。

    $ cp a.out a.out.save
  3. 使用 discover 检测二进制文件。

    $ discover -a a.out
  4. 运行检测过的二进制文件以收集动态内存访问数据。

    $ ./a.out

    动态内存访问错误数据将写入 sample/a.out.analyze/dynamic 目录。

  5. 启动代码分析器 GUI 以查看结果。

    $ code-analyzer a.out &
    image:显示静态和动态错误的代码分析器 “Results“(结果)标签

    "Results"(结果)标签同时显示静态问题和动态内存问题。问题描述的背景颜色可以指明问题是静态代码问题(棕褐色)还是动态内存访问问题(淡绿色)。

  6. 要过滤结果以便仅显示动态内存问题,请在 "Issues"(问题)标签中选中 "Dynamic"(动态)选项。

    image:显示针对动态问题选中复选框的 “Issues“(问题)标签

    现在,"Results"(结果)标签仅显示三个核心动态内存问题。


    注 -  修复核心问题后可能会消除其他问题。一个核心问题通常会伴有 "All"(所有)视图中列出的多个问题,例如,因为这些问题具有共同的分配点或出现在同一函数中的同一数据地址上。
  7. 要查看所有动态内存问题,请选择 "Issues"(问题)标签顶部的 "All"(所有)单选按钮。现在,"Results"(结果)标签显示六个动态内存问题。

    image:显示六个动态内存问题的代码分析器 “Results“(结果)标签

    查看已添加到显示屏幕中的三个问题,并了解它们如何与核心问题相关联。在基于相应成因修复显示屏幕中的第一个问题后,可能还会消除第二个和第三个问题。

    要在调查第一个问题的成因时隐藏其他动态内存访问问题,请单击每个问题对应的 "Ignore"(忽略)按钮 image:忽略按钮


    注 -  以后,通过单击 "Results"(结果)标签顶部的 "Ignored"(已忽略)按钮,可以重新显示关闭的问题。
  8. 通过单击错误图标以显示堆栈跟踪来调查第一个问题。

    对于此问题,堆栈跟踪包括 "Call Stack"(调用堆栈)和 "Allocated At Stack"(堆栈上的已分配空间)。

    image:“Uninitialized Memory Read“(读取未初始化的内存)错误的堆栈跟踪
  9. 双击堆栈中的函数调用以查看源文件中的关联行。

    打开源文件时,堆栈跟踪显示在该文件下的 "Details Window"(详细信息窗口)中。

    image:“Uninitialized Memory Read“(读取未初始化的内存)错误的源文件(包含 “Details Window“(详细信息窗口))
  10. 按右上角的 X 关闭代码分析器 GUI。

收集和显示代码覆盖数据

无论是否收集了静态数据或动态内存访问数据,您都可以编译、检测和运行应用程序来收集代码覆盖数据。请注意,在收集动态内存错误数据之前使用 –g 选项生成应用程序时,您在检测二进制文件之前保存了它的一个副本。

  1. 复制要检测的已保存二进制文件以进行覆盖数据收集。

    $ cp a.out.save a.out
  2. 使用 uncover 检测二进制文件:

    $ uncover a.out
  3. 运行检测过的二进制文件以收集代码覆盖数据。

    $ ./a.out

    代码覆盖数据将写入 sample 目录中的 a.out.uc 目录。

  4. a.out.uc 目录运行 uncover

    $ uncover -a a.out.uc

    代码覆盖数据将写入 sample/a.out.analyze/uncover 目录。

  5. 启动代码分析器 GUI 以查看结果:

    $ code-analyzer a.out &

    "Results"(结果)标签同时显示静态问题、动态内存问题和代码覆盖问题。

  6. 要过滤结果以便仅显示代码覆盖问题,请在 "Issues"(问题)标签中选中 "Coverage"(覆盖)选项。

    现在,"Results"(结果)标签仅显示十二个代码覆盖问题。每个问题的描述中均包含一个潜在的覆盖百分比,此百分比是在增加覆盖相关函数的测试时将加入该应用程序总覆盖范围的覆盖百分比。

    image:显示某些代码覆盖问题的代码分析器 “Results“(结果)标签

    提示  -  要查看所有问题而不上下滚动,请单击 "Results"(结果)标签顶部的 "Snippets"(代码片段)按钮 image:隐藏代码片段按钮 以隐藏代码片段。

    在 "Issues"(问题)标签中,previse_all.c 源文件中有九个覆盖问题,sample2.c 源文件中有三个覆盖问题,而 previse_1.c 源文件中有一个覆盖问题。

  7. 要仅显示 sample2.c 文件的问题,请在 "Issues"(问题)标签上选中该文件对应的选项。

    "Results"(结果)标签现在仅显示在 sample2.c 中找到的三个代码覆盖问题。

    image:显示 sample2.c 的代码覆盖错误的代码分析器 “Results“(结果)标签
  8. 单击其中一个问题的源文件路径链接以打开源文件。在源文件中向下滚动,直到在左边界看到警告图标。

    image:包含未覆盖代码的源文件部分以及覆盖问题的警告图标

    将使用黄色的方括号来标记未覆盖的代码。

    在文件中找到的覆盖问题标记有警告图标 image:警告问题图标