IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Rational  >

在 .NET 应用程序上运行 Rational PurifyPlus

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

英文原文

英文原文


级别: 初级

Soumita Ghosh, IT 软件工程师, IBM

2008 年 12 月 18 日

Journal icon 阅读如何为在 Microsoft .NET 平台上开发的产品安装并运行 IBM Rational PurifyPlus。

来自 The Rational Edge

插图 IBM® Rational® PurifyPlus™ 是一个获奖的用来帮助开发人员更快地撰写更可靠的代码的动态分析解决方案。它包含封装到一个产品中的三个基本功能:

  • 内存调试用于在非托管的代码中找到内存泄漏和缓冲区溢出。对于托管的代码,帮助找到由于集合中的“未释放的”引用的内存泄漏。
  • 性能概要用函数调用的图示突出应用程序的性能瓶颈并增强应用程序的可理解性。
  • 代码覆盖用线级精确度确定未测试的代码。

PurifyPlus 支持 Windows、Linux、Solaris、AIX,和 HP-UX。

本文将介绍如何在 .NET 应用程序上使用 PurifyPlus。

在 .NET 应用程序上运行 PurifyPlus

.NET 上的 PurifyPlus Memory Profiler 帮助您:

  • 查看实时的内存信息
    概要程序展示了关于垃圾收集(garbage collected,GC)堆上执行的所有 .NET 实例分配,以及贮存在堆上的所有实例的实时信息。
  • 通过收集和比较 .NET 内存快照简单地识别内存泄漏
    Purify 对当前数据进行快照,并且在 Navigator 中创建快照入口,同时继续记录数据。该数据提供许多有用的信息,并且使得识别潜在的内存泄漏很容易做到,特别是当比较两个快照时。
  • 研究产品代码中的内存问题
    通过使用“依附进程”特性,以及导入内存 dump 文件的功能,极大地简化了对产品代码中的内存问题的概要。
  • 执行自动的内存测试
    Rational PureAPI 功能能够自动地检测内存泄漏,并且在被概要的程序中控制概要程序。
  • 检索关于本地内存的信息
    除了展示关于 GC 堆和托管的资源的信息,PurifyPlus 还收集关于非托管的代码的信息。




回页首


安装 PurifyPlus

如下列步骤所示,安装 PurifyPlus 是一个直截了当的过程:

    1. 下载 PurifyPlus 并通过 GUI 安装。当遇到提示时,只需点击 Next 按钮,直到产品安装完毕。
    2. 下载 License Server 并按照类似方法安装。
    3. 配置 License Server 指向 PurifyPlus 提供的版本许可号

图 1 例举了如何在安装 License Server 之后进行配置。License Server 应该为您的本地主机的名称。

屏幕图像

图 1: 配置 License Server

4. 接下来,如图 2 所示,配置 License 使用映射程序(Settings > License Usage Mapper)。对于 Rational Purify、Quantify,和 PureCov,在右边的选项卡上,选择 Rational PurifyPlus for Windows,并且取消选择其他选项。
屏幕图像

图 2: 配置 License Usage Mapper

5. 现在通过浏览您保存的位置导入 License Key 文件。您将在 License Key Administrator 向导中看到 License Key,如图 3 所示。
屏幕图像

图 3: License Key Administrator 向导

现在,准备启动 PurifyPlus。





回页首


设置环境,在 .NET 上运行 PurifyPlus

要让 PurifyPlus 在 .NET 上工作,您需要执行以下一些步骤:

  1. 到 <Install_directory for Rational>\Common 并运行 AspNetMon.exe。在程序运行过程中,您将看到右手下方系统托盘中的交通灯图标。
  2. 单击右键,并选择 Enable .NET profiling for Rational PurifyPlus。
  3. 启动 Rational PurifyPlus 并附加要净化的进程。然后:
    • 等待两分钟
    • 观察 PurifyPlus 是否稳定(一段时间后图象应该稳定了)
    • 查看 w3wp.exe 是否在 Task Manager 中出现多次
    • 如果是,停止 aspnetmon.exe,杀掉所有 w3wp.exe 进程并重新启动 AspNetMon.exe。
    • 打开客户端 Web 页面(您需要启动新的浏览器来进行此操作)。这将创建一个 w3wp.exe 进程。
    • Purify 应该自动地显示出概要图(对于 w3wp.exe)。
  4. 点击 Run。
  5. 继续运行 PurifyPlus。




回页首


启动 PurifyPlus

首先选择 Start > All Programs 并且启动 IBM Rational PurifyPlus > Purify。图 4 显示了 Rational Purify 启动窗口。

图 4: 您启动 PurifyPlus 时的第一个窗口

对于托管代码,使用选项“Memory profiling data”。对于非托管代码,使用选项“Error and leak data”。

在执行您的应用程序的过程中,PurifyPlus 将依附在进程上。





回页首


在 .NET 上使用 PurifyPlus

当您在选择“Memory profiling data”选项的情况下运行应用程序时,PurifyPlus 将显示一张描述了内存使用量的图。您可以继续浏览您感兴趣的 Web 页面,并且同时您将注意到图上的变更。

举例来说,当加载 Web 页面时,图上的曲线将成指数级增长,这显示在加载 Web 页面时使用了巨大量的内存。当加载之后,图像将稳定,而在您浏览其他页面时再次变更。

一旦应用程序开始运行,结果将自动地显示。图 5 显示了 PurifyPlus 中的概要图。

屏幕图像

图 5: 当 PurifyPlus 启动时的内存概要图

快照

您可以为您正在分析的应用程序,在其运行过程中保存内存概要数据的“快照”,以便您可以之后更详细地观察。快照包含一组关于积累到一个具体时刻的程序状态和量度信息的数据。

要用 PurifyPlus 创建快照,只需在 Purify 工具栏中点击照相机图标。PurifyPlus 对当前数据进行快照,并且在 Navigator 中创建快照入口,同时继续记录数据。您可以将快照保存到 PurifyPlus 数据文件(.pmy) 或者保存到 ASCII 文本文件(.txt) 中。图 6 显示了 PurifyPlus 快照的样子。

屏幕图像

图 6: PurifyPlus 快照

图 7 例举了 .NET 应用程序的 PurifyPlus 快照。

屏幕图像

图 7: .NET 应用程序的快照





回页首


源自 Rational PurifyPlus 的结果

PurifyPlus 提供许多不同的窗口来帮助您执行内存概要数据的详细分析,每个窗口如下详细介绍:

  1. Data browser 窗口 —— 在 Memory 选项卡中显示执行的概要数据,在 Call 图、Function List 视图,和 Object List 视图选项卡中显示内存概要数据。
  2. Function Detail 窗口 —— 显示关于具体的 Java 或 .NET 托管方法,及其直接调用者和子调用的数据。该数据以表格(对于聚集运行和快照)和图形格式显示。
  3. Object Details 窗口 —— 包含关于具体对象的详细信息。

Data browser 窗口

要显示 Data Browser 窗口,就在 Purify 菜单中选择 View > Data Browser,或单击您在 Navigator 中已经选择的执行的图标。您将在 Data Browser 窗口中看到 Memory 选项卡、Call graph 选项卡、Function List 视图、Object List 视图。

Memory 选项卡

Memory 选项卡概述了程序的总内存使用,以及在运行过程中在哪里分配了多少内存(参见图 8)。

屏幕图像

图 8: Memory 选项卡显示了描述在应用程序运行时使用的内存量的图。

Function List View 选项卡

Function List View 选项卡(参见图 9)列出了程序使用的所有函数和方法,没有按模块或文件分组。此视图帮助根据各种各样的标准对数据排序,并且帮助找到感兴趣的方法和函数,并且显示或隐藏(Show/Hide)它们。

屏幕图像

图 9: Function List View 显示了应用程序调用的函数,以及它们使用的内存量。

函数默认从最高内存使用率到最低内存使用率,以便您可以集中到消耗最大内存的函数上。这些列可以按正序或倒序排序。

Call Graph 选项卡

Call Graph 选项卡提供应用程序调用结构的图形表示(参见图 10)。它给出了在应用程序运行过程中使用的内存或 CPU 时间的整个描述。

屏幕图像

图 10: 实例 Call Graph

Call Graph 选项卡显示了函数调用的序列,以及它们使用的内存。粗线和细线帮助您分别区分消耗内存多或少的函数(参见图 11)。Call Graph 还突出了从代价最高的函数回到程序的一开始的路径,较粗的线表示代价较高的路径。您可以根据各种各样的标准突出其他函数。

屏幕图像

图 11: Call Graph 中的较粗的线表示内存密集的函数。

如果您双击任意这些方法(参见图 11 中的矩形框),您将看到如下所述的 Function Detail 窗口。

Object List 选项卡

Data Browser 窗口中的 Object List 选项卡(参见图 12)列出了当前选择的内存概要数据集中的所有根对象,或者列出了单个对象引用树中的所有内存对象。

屏幕图像

图 12: Object List 选项卡及其特性的实例

如果在 Settings 对话框的 PowerCheck 选项卡中选择了“Generate Object Reference Graph data”,并且在 Preferences 对话框的 Workspace 选项卡中选择了“Show Object List View”的话,才可以使用 Object List 选项卡。

如果您为对象收集数据,那么在 Purify 菜单中选择 View > Data Browser,或单击图标并选择 Object List View 选项卡来显示对象列表。

Object List View 可以显示以下信息:

  • 对象、类文件,和方法名称
  • 受引用对象的数量,及对其他对象的引用
  • 对象当前字节数
  • 对象 + 引用(object + references,O+R)大小
  • 对象的创建时间以及生存的垃圾集合的数量
  • 如果有的话,显示源代码中创建对象的位置的大约行数
  • 对于根对象,显示根类型

Function Detail 窗口

要显示 Function Detail 窗口,在 Data Browser 窗口中单击 Call Graph 或 Function List View 选项卡,然后双击方法名,或者选择方法并单击图标。Function Detail 窗口显示关于具体的 Java 或 .NET 托管方法及其直接调用者和子调用的数据。

在该视图中以图形或表格形式显示的信息类型是(参见图 13):

  • 方法数据 —— 方法本身的详细的内存数据。
  • 调用者数据 —— 一列直接调用者及其详情。
  • 子调用数据 —— 一列直接子调用及其详情。
  • 对象数据 —— 如果方法创建了对象,那么该窗口还包含一列所选择的方法目前分配的所有对象。
屏幕图像

图 13: Function Detail 窗口

Object Details 窗口

只有当在 Settings 对话框的 PowerCheck 选项卡中选择了“Generate Object Reference Graph data”时,Object Details 窗口才可用(参见图 14)。

屏幕图像

图 14: 选择“Generate object reference graph data”选项以查看 Object Details 窗口。

Object Details 窗口出现在您:

  • 在 Object List View 选项卡中双击对象时
  • 在 Function Detail 窗口中双击对象时
  • 选择对象,并单击右上部的 PurifyPlus 工具栏中的图标时(参见图 15)
屏幕图像

图 15: Object Details 视图图标的位置

图 16 显示了 Object Details 窗口的实例。

屏幕图像

图 16: Object Details 窗口及其特性的实例

注意 Object List View 按如下进行分组和显示对象:

  • 当您在为所选择的聚集执行或快照数据集中的对象打开 Object Details 窗口之前,Object List View 显示了所选择的数据集中的所有根对象。
  • 当您为所选择的数据集中的对象打开 Object Details 窗口之后,Object List View 只显示 Object Reference Graph 中显示的对象。
  • 当您关闭 Object Details 窗口之后,Object List View 重新显示所有根对象。




回页首


需要记忆的重点

以下是一些使用 PurifyPlus 时要铭记于心的重点:

  • 您应该启用 Purify,然后来到第一页。记住依附 Purify 将迫使 App Pool 进行回收。Web 应用程序将丢失所有在会话状态中未保存的数据,并且在一些设计很糟的 Web 应用程序中可能引起未预期的行为。
  • .NET 应用程序不在 IIS 进程中运行。它们在 W3WP(工人进程或应用程序池)中运行。

PurifyPlus 如何在 .NET 上工作

作为参考,这里概述了 PurifyPlus 在 .NET 环境中如何工作:

  1. 当您启用 Purify 时,AspNetMon 进程杀掉了工人进程(应用程序池)。
  2. IIS 检测到应用程序池消失。
  3. IIS 立即启动新的。
  4. AspNetMon.exe 打断了进程创建。
  5. 它清除了新的进程环境内存。当 Purify 依附上之后,直到工人进程结束。

当找到 .NET 应用程序中的内存泄漏时,查看源代码

此处介绍了一些在 .NET 应用程序中检测到内存泄漏时查看源代码的技巧:

  1. 内存泄漏本身不会出现在 .NET 应用程序中。相反,.NET 有 GC 堆。
  2. 通过 PurifyPlus 快照特性的帮助,您可以分析对象或方法级内存使用。
  3. 不显示行数。当您切换到注释源代码时,使用此信息。然后直接带您到达行。
  4. 在默认设置或 Application 设置中,.NET 拥有对行和函数模式的选择。
  5. 只有在 Line 模式下才可以看源代码(参见图 17)。
屏幕图像

图 17: 设置选项查看源代码

  1. 如果您从 Function Detail 视图切换到 Annotated Source,那么您将看到函数源代码。
  2. 如果您从 Object Detail 视图切换,您将来到分配的位置。
  3. 在您来到源代码之前,您必须确定未释放的对象并找出谁持有它们。
  4. 函数模式下不保存源代码级别信息。Application 设置覆盖了默认设置。
  5. 有两种使用行信息的方式:
    • 在调用图中定位函数
    • 从对象信息定位对象分配的行

您还可以在命令行设置

图 18 显示了如何查看源代码文件。

屏幕图像

图 18: 如何查看源代码文件





回页首


获取更多信息

本文中涵盖的所有主题的更多细节可以在 PurifyPlus Help 页面中找到。您还可以访问 www.ibm.com/developerworks,在那里您可以找到关于 Rational PurifyPlus 的许多文章。您还可以参与 Purify Plus 论坛 ,在那里您可以提问,开发人员将为您解答。



参考资料

学习

讨论
  • 已经专门为 Rational Edge 文章创建了一个 新讨论区,因此现在您可以在此论坛中分享您对本文、本期期刊其它文章或我们过往期刊上的其他文章的看法。查阅您遍及世界的同行所阐述的观点,创建您自己的讨论,或者加入正在进行中的讨论。点击 这里 开始。

  • 全球 Rational 用户组社区


关于作者

author photo1

Soumita Ghosh 在 IBM 软件研究室工作了三年多,参与了许多不同的团队,如 Informix,VisualAge 以及 Rational。 现在,她已经在 Rational Lab Services 团队作为一名 IT 软件专家工作了一年多,目前工作于 Enterprise Modernization 套件产品,以及 Rational PurifyPlus。




对本文的评价








IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款