安裝 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 是一種建?蚣芎痛a生成設施,用于根據結構化數據模型構建工具和其他應用程序!保┰谙螺d文件之后,進入包含 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 模式的組件!保┰谙螺d文件之后,進入包含 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(小寫)可以退出應用程序。
文章來源于領測軟件測試網 http://www.kjueaiud.com/