Oracle® Solaris Studio 12.4:代码分析器教程

退出打印视图

更新时间: 2014 年 10 月
 
 

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

无论是否收集了静态数据,您都可以编译、检测和运行应用程序来收集动态内存访问数据。有关通过使用 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。