安装 Eclipse V3.1 SDK
下载适合自己平台的 Eclipse 3.1 SDK。可以在 Eclipse Downloads 上找到这个 SDK。通常,安装时只需将 Eclipse .tar.gz 文件释放到您选择的目录中。例如,如果使用 Linux,那么下载 Eclipse V3.1 SDK tarball,然后使用以下命令将它释放到一个目录中,比如 ~/java/:
% cd ~/java
% mv ~/eclipse-SDK-3.1.1-linux-gtk.tar.gz .
% tar zxvf eclipse-SDK-3.1.1-linux-gtk.tar.gz
如果想检验 Eclipse 是否已经成功安装了,那么留在释放 Eclipse 的目录中,确保 java 可执行文件在 PATH 中并运行 java -jar eclipse/startup.jar。例如:
清单 2. 检验 Eclipse 是否已经成功安装了
% export JAVA_DIR=$HOME/java
% export JAVA_HOME=$JAVA_DIR/j2sdk1.4.2_08/sdk
% export PATH=$JAVA_HOME/bin
% export CLASSPATH=$JAVA_HOME
% cd $JAVA_DIR
% java -jar eclipse/startup.jar
如果提示您为工作空间选择目录,那么输入 $HOME/java/workspace。这个目录将保存您在 Eclipse 中创建的所有项目。(当然,如果有许多项目,以后可以选择其他目录,让一个工作空间只包含一个项目。)
安装 EMF SDK V2.1
如果 Eclipse 正在运行,就退出它并下载 EMF SDK V2.1。(根据 EMF Web 站点所说,“EMF 是一种建模框架和代码生成设施,用于根据结构化数据模型构建工具和其他应用程序。”)在下载文件之后,进入包含 Eclipse 文件夹的目录并运行 unzip emf-sdo-SDK-2.1.0.zip。例如:
清单 3. 运行 unzip emf-sdo-SDK-2.1.0.zip
% cd $JAVA_DIR
% ls
eclipse j2sdk1.4.2_08
% mv ~/emf-sdo-SDK-2.1.0.zip .
% unzip emf-sdo-SDK-2.1.0.zip
creating: eclipse/features/
creating: eclipse/features/org.eclipse.emf.ecore.sdo_2.1.0/
creating: eclipse/features/org.eclipse.emf_2.1.0/
inflating: ...
安装 XSD SDK V2.1
下载 XSD SDK V2.1。(根据项目 Web 站点所说,“XSD 是一个库,它提供了一个应用编程接口(API),用于按照 World Wide Web Consortium(W3C)XML Schema 规范的描述操作 XML 模式的组件。”)在下载文件之后,进入包含 Eclipse 目录的目录并运行 unzip xsd-SDK-2.1.0.zip。下面是一个例子:
% cd $JAVA_DIR
% mv ~/xsd-SDK-2.1.0.zip .
% unzip xsd-SDK-2.1.0.zip
如果提示您确认覆盖任何文件,那么只需按 y(小写)对每个问题回答 Yes。
安装 UML V2.0 Metamodel Implementation
要使用 TPTP 的 Unified Modeling Language(UML)特性,就需要安装 UML V2.0 Metamodel Implementation。如果正在使用 Eclipse V3.1.1,那么下载 V1.1.1 of UML2,然后在包含 Eclipse 的目录中释放它的存档文件:
% cd $JAVA_DIR
% mv ~/uml2-1.1.1.zip .
% unzip uml2-1.1.1.zip
安装 TPTP 运行时
对于下一步,下载 TPTP 运行时,这包含所有 TPTP 特性和集成两个系统所需的 Eclipse 插件。要安装 TPTP,进入包含 Eclipse 的目录并运行 unzip tptp.runtime-TPTP-4.1.0.zip。下面是一个例子:
% cd $JAVA_DIR
% mv ~/tptp.runtime-TPTP-4.1.0.zip .
% unzip tptp.runtime-TPTP-4.1.0.zip
安装 Agent Controller
Agent Controller 是 TPTP 的一个重要组件,它使 Eclipse 能够启动应用程序并与这些应用程序进行交互,从而提取分析数据。下载适合您的操作系统的 Agent Controller 运行时。接下来,在包含 Eclipse 的目录中创建一个称为 tptpd 的目录,并将 Agent Controller 存档文件释放到这个目录中。要运行的命令是:
% mkdir $JAVA_DIR/tptpd
% cd $JAVA_DIR/tptpd
% mv ~/tptpdc.linux_ia32-TPTP-4.1.0.zip .
% unzip tptpdc.linux_ia32-TPTP-4.1.0.zip
如果看到两个下面这样的错误:
linking: lib/libxerces-c.so
warning: symbolic link (lib/libxerces-c.so) failed
linking: lib/libxerces-c.so.24
warning: symbolic link (lib/libxerces-c.so.24) failed
那么必须通过输入以下命令来手工重新创建这两个链接:
% cd $JAVA_DIR/tptpd/lib
% rm libxerces-c.so libxerces-c.so.24
% ln -s libxerces-c.so.24.0 libxerces-c.so
% ln -s libxerces-c.so.24.0 libxerces-c.so.24
添加 Agent Controller 目录
要使用 Agent Controller,必须将它的 lib 目录添加到 LD_LIBRARY_PATH 中。例如,如果正在运行 Linux 并采用以上步骤中给出的目录结构,那么用以下命令添加 $JAVA_DIR/tptpd/lib:
% export LD_LIBRARY_PATH=$JAVA_DIR/tptpd/lib:$LD_LIBRARY_PATH
还必须确保 Controller 的 lib 和 bin 目录的内容是可执行的。为此,运行:
% chmod +x $JAVA_DIR/tptpd/{bin,lib}/*
现在将配置和启动 Agent Controller 的脚本添加到 PATH:
% export PATH=$JAVA_DIR/tptpd/bin:$PATH
针对环境配置 Agent Controller
最后,要配置 Agent Controller 以便匹配环境。进入 Agent Controller 的 bin 目录,然后运行 SetConfig.sh。
% cd $JAVA_DIR/tptpd/bin
% ./SetConfig.sh
当配置脚本提示您进行选择时,接受默认设置。运行配置脚本会在 Agent Controller 的文件层次结构中创建文件 config/serviceconfig.xml。
测试 Agent Controller
为了测试 Agent Controller,运行 RAStart.sh。为了停止 Agent Controller,运行 RAStop.sh:
清单 4. 停止 Agent Controller
db% RAStart.sh
Starting Agent Controller
RAServer started successfully
% RAStop.sh
RAServer stopped, pid = 5891
RAServer stopped, pid = 5892
RAServer stopped, pid = 5893
RAServer stopped, pid = 5894
RAServer stopped, pid = 5895
RAServer stopped, pid = 5896
RAServer stopped, pid = 5897
RAServer stopped, pid = 5898
RAServer stopped, pid = 5899
RAServer stopped, pid = 5900
RAServer stopped, pid = 5901
RAServer stopped, pid = 5902
RAServer stopped, pid = 5904
RAServer stopped, pid = 5905
RAServer stopped, pid = 5906
现在完成了!重新启动 Eclipse。在 Eclipse 工具栏上应该会看到一个新按钮,如图 1 所示。这是 TPTP Profile 按钮。TPTP 已经安装了,您可以继续学习本教程了。
图 1. TPTP Profile 按钮
对 Java 应用程序进行分析
既然已经安装了 TPTP 和底层软件,现在就运行 Eclipse。
示例应用程序
要分析的 Java 应用程序见清单 5。
清单 5. 由少量对象组成的简单 Java 应用程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class SpaceShipToy {
/*
* To build a spaceship, you need a capsule, a booster,
* three stages, and two monkeys (borrowed
* from a Barrel of Monkeys).
*/
public Capsule capsule = new Capsule();
public Booster booster = new Booster();
public Stage[] stage = new Stage[3];
public SpaceShipToy()
{
for (int i = 0; i < 3; i++)
stage = new Stage();
}
private void _killTime(int seconds)
{
if (seconds <= 0)
return;
for (int i = 0; i < seconds; i++);
}
static final int MINUTE = 60;
static final int CAPSULE = 2 * MINUTE;
static final int BOOSTER = 5 * MINUTE;
static final int STAGE = 3 * MINUTE;
static final int MONKEY = 10 * MINUTE;
class Capsule {
public Monkey chimp1 = new Monkey(), chimp2 = new Monkey();
public Capsule() {
System.out.println("Start building the capsule...");
_killTime(CAPSULE);
chimp1.build();
chimp2.build();
System.out.println("Capsule complete.");
}
}
class Booster {
public Booster() {
System.out.println("Start booster...");
_killTime(BOOSTER);
System.out.println("Blast off.");
}
}
class Stage {
public Stage() {
System.out.println("start stage...");
_killTime(STAGE);
System.out.println("Stage complete.");
}
}
class Monkey {
public void start() {
System.out.println("Start the monkey business...");
}
public void build() {
start();
_killTime(MONKEY);
finish();
}
public void finish() {
System.out.println("Monkey business complete.");
}
}
public static void main(String[] args) throws java.io.IOException
{
final int NUMBERTOYS = 9;
BufferedReader in = new
BufferedReader(new InputStreamReader(System.in));
SpaceShipToy[] toys = new SpaceShipToy[NUMBERTOYS];
String input = in.readLine().trim();
System.out.println("Toy factory is up and running...");
System.out.flush();
for (int i = 0; i < NUMBERTOYS; i++)
toys = null;
while (!input.equalsIgnoreCase("q")) {
if (input == null || input.length() != 1
|| !Character.isDigit(input.charAt(0))) {
System.err.println ("Unknown option. Try 0-9, q");
input = in.readLine().trim();
continue;
}
int number = Integer.valueOf(input).intValue();
if (number == 9) {
new SpaceShipToy();
System.out.println("Whoops... Lost one...");
}
else {
if (toys[number] != null) {
System.out.println("Shipping toy # " + number);
toys[number] = null;
}
else {
System.out.println("Building toy # " + number);
toys[number] = new SpaceShipToy();
}
}
input = in.readLine().trim();
}
}
}
这个 Java 应用程序很简单:它 “构建” 玩具飞船并将它们 “发射” 到商店。每个玩具由一个 Java 对象代表,这个对象包含几个其他对象,这些对象各自代表玩具的一个部件。每个玩具部件都要花一定的时间来构建。
为了使用这个应用程序,按 0 到 8 数字键来构建玩具。如果再次按同一个键,构建的玩具就被 “发射”,相关联的对象被取消引用,从而可以被垃圾收集。因此,在任何时候在内存中最多可以有 9 个玩具(如果构建了所有 9 个玩具,而且都没有发射)。
按 9 键会创建一个未被引用的对象,这模拟了内存泄漏。按 q(小写)可以退出应用程序。
文章来源于领测软件测试网 https://www.ltesting.net/