バイトコード間の動的依存情報を 抽出するJavaバーチャルマシン 井上研究室 誉田 謙二 プログラムスライス プログラム中のある文sのある変数v (スライス 基準)の値に影響を与えうる文の集合 1: 2: 3: 4: 5: 6: a = 5; b = a + a; if (b > 0) { c = a; } d = b; スライス基準(6, b)に 対するスライス 1: 2: 3: 4: 5: 6: a = 5; b = a + a; if (b > 0) { c = a; } d = b; デバッグ対象が限定され、フォールト位置特定 を効率よく行うことができる 2002/02/19 2001年度修士論文発表会 1 スライスの計算過程 1.依存関係解析 データ依存関係 制御依存関係 2.プログラム依存グラフ(PDG)構築 節点:各プログラム文 有向辺:文間の依存関係 3.グラフ探索 データ依存関係 10: a = 1; 11: c = 4; 12: b = a; a 制御依存関係 20: if (a < 1) { 21: b = a; 22: } プログラム依存グラフ (PDG) スライス基準に対応する節点から 有向辺を逆向きに探索 2002/02/19 2001年度修士論文発表会 2 静的・動的・DCスライス 静的スライス ソースコードに存在する全経路に対し、依存関係解析を行う 計算されるスライスの精度低下 動的スライス 特定の実行系列に対し、依存関係解析を行う 実行系列の保存に伴う解析コストの増大 DCスライス 特定の経路に対し、動的にデータ依存関係解析を行う 静的に制御依存関係解析を行い、実行系列は保存しない 低コストでかつ精度の高いスライス計算が可能 2002/02/19 2001年度修士論文発表会 3 動的データ依存関係解析 一時記憶:キャッシュ 各変数と1対1対応するように用意する 各データを最後に定義した命令を保持する アルゴリズム 変数が定義されたとき 定義した文をキャッシュに保存 10: a = 1; 11: c = 4; 12: b = a; 変数が参照されたとき 最後に定義した文をキャッシュから取得 取得した文と実行中の文との間に 発生するデータ依存関係を抽出 2002/02/19 2001年度修士論文発表会 a キャッシュ a b c 10 - 11 (文12実行時) 4 スライス手法の比較 制御依存関係 データ依存関係 PDG節点 静的スライス 静的 DCスライス 静的 動的スライス 動的 静的 プログラム文 動的 プログラム文 動的 実行時点 スライスサイズ(精度): 静的 DC 動的 依存関係解析コスト: 動的 ≫ DC > 静的† Y.Ashida, F.Ohata and K.Inoue: “Slicing Methods Using Static and Dynamic Information”, Proceedings of the 6th Asia Pacific Software Engineering Conference , pp.344-350, Takamatsu, Japan, December (1999). † 2002/02/19 2001年度修士論文発表会 5 研究目的 オブジェクト指向言語 Java 近年のソフトウェア開発環境で多く利用される 多くの実行時決定要素の存在 配列の添字・オブジェクトへの参照・動的束縛・ 例外処理・並列処理 「Javaプログラムに対するDCスライスの適用」 2002/02/19 2001年度修士論文発表会 6 既存の手法とその問題点 ソースコード埋め込みによるDCスライス計算† 解析命令を埋め込んだソースコードを コンパイル・実行し、動的情報を持つ PDGを構築 問題点 構文制約による解析精度の低下 クラスファイルしか存在しないクラスを 介した依存関係解析の実現が困難 1 : a = 10; 2 : b = a + 1; 1’: def(a, 1); 1 : a = 10; 2’: ref(a, 2); 2’: def(b, 2); 2 : b = a + 1; F.Ohata, K.Hirose, M.Fujii and K.Inoue:“A Slicing Method for Object-Oriented Programs Using Lightweight Dynamic Information”, Proceedings of 8th Asia Pacific Software Engineering Conference , pp.273-280, Macau, China, December (2001). † 2002/02/19 2001年度修士論文発表会 7 提案手法 「JVMに基づくDCスライスのJavaへの適用」 コンパイル時に、バイトコードの各命令とソースコー ドのトークン集合との対応表を生成 バイトコードに対し、依存関係解析を行う JVMを用いた動的データ依存関係解析 静的制御依存関係解析(JVMとは独立) バイトコードに対するPDG構築、スライス計算 生成した対応表をもとにバイトコードでのスライス をソースコードに対応付ける 2002/02/19 2001年度修士論文発表会 8 計算手順 ソースコード class A Javaコンパイラ スライス結果 対応表 class A iconst_2 2 iload_1 j iadd + istore_1 j= バイトコードでのPDG クラスファイル class A iconst_2 iload_1 iadd istore_1 Java Virtual Machine 通常の実行結果 2002/02/19 2001年度修士論文発表会 9 提案手法による利点 解析精度の向上 コードの埋め込みを行わないため、構文制約の影 響を受けず、それに伴う解析精度の低下を防止 JDKライブラリ等、クラスファイルしか存在しないクラ スを介した依存関係の抽出が可能 細粒度の解析の実現 バイトコードの各命令をPDG節点とすることで、 ソースコードの各文を節点とした場合と比べ細粒 度の解析が可能 2002/02/19 2001年度修士論文発表会 10 JVMでの動的データ依存関係解析 Java Virtual Machine 1: 2: 3: 4: iconst_1 iconst_2 iadd istore_0 ローカル変数 0 2 3 1 対応するキャッシュ データ依存関係 0 2002/02/19 3 スタック s4 2001年度修士論文発表会 s2 s1 s3 11 提案手法の実現 提案した手法を実現するシステムを構築 対応表出力(コンパイラ)† 動的データ依存関係解析(JVM)† 静的制御依存関係解析 PDG構築・スライス計算 ユーザインターフェイス 総行数:約580,000行(うち追加コード16,000行) † 2002/02/19 JDK付属の javac , java に対する機能追加により実現 2001年度修士論文発表会 12 評価(1/2) 簡易データベースシステム(4クラス・262行) (Pentium4 1.5GHz, 512MB, FreeBSD 5.0-CURRENT, JDK1.2.2) スライスサイズ [行(全体に対する割合)] 静的スライス 提案手法 動的スライス スライス基準1 60(22.9%) 30(11.4%) 24(10.3%) スライス基準2 19(7.3%) 15(5.7%) 14(5.4%) 静的スライスに比べ約50%から80%のスライスサイズ 静的スライスに比べ精度の高いスライス計算 2002/02/19 2001年度修士論文発表会 13 評価(2/2) JVM実行時間 [ms] 通常実行 解析付実行 325 2,058 JVM消費メモリ [Kbytes] 通常実行 解析付実行 3,780 15,980 構築されるPDGの節点数 提案手法 動的スライス 34,966 1,198,596 動的スライスの計算には30倍以上の解析コストが必要 動的スライスに比べ十分に小さいコストでのスライス計算 2002/02/19 2001年度修士論文発表会 14 まとめ・今後の課題 JVMを用いたDCスライス計算手法の提案 JVMによる動的データ依存関係解析 バイトコードでのスライスをソースコードに対応付け 小さい解析コストで、精度の高いスライス計算を実現 今後の課題 動的に発生する制御フローへの対応 ネイティブメソッドへの対応 2002/02/19 2001年度修士論文発表会 15
© Copyright 2024 ExpyDoc