Javaプログラムの コールスタック状態に着目した 実行履歴の対話的な分析ツール

Slides:



Advertisements
Similar presentations
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
全体ミーティング (4/25) 村田雅之.
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
プログラムの動作を理解するための技術として
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
クラス動作シナリオ可視化手法の プログラム理解作業に対する有効性評価
アスペクト指向プログラミングを用いたIDSオフロード
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
静的情報と動的情報を用いた プログラムスライス計算法
オブジェクト指向プログラムのための 動的結合メトリクスの評価
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
ソードコードの編集に基づいた コードクローンの分類とその分析システム
Javaソースコード蓄積・ 検索システムSPARS-Jの概要
動的依存グラフの3-gramを用いた 実行トレースの比較手法
シーケンス図を用いて実行履歴を可視化するデバッグ環境の試作
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
実行時情報に基づく OSカーネルのコンフィグ最小化
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
通信機構合わせた最適化をおこなう並列化ンパイラ
動的データ依存関係解析を用いた Javaプログラムスライス手法
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
コードクローンの動作を比較するためのコードクローン周辺コードの解析
ソースコードの静的特性を用いた Javaプログラム間類似度測定ツールの試作
未使用メモリに着目した 複数ホストにまたがる 仮想マシンの高速化
不確実データベースからの 負の相関ルールの抽出
プログラム理解におけるThin sliceの 統計的調査による有用性評価
バイトコードを単位とするJavaスライスシステムの試作
ソフトウェア保守のための コードクローン情報検索ツール
Java における 先進的リフレクション技術
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
既存ソフトウェア中の 頻出コード片を用いた コード補完手法の提案
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
Peer-to-Peerシステムにおける動的な木構造の生成による検索の高速化
コーディングパターンの あいまい検索の提案と実装
JAVAバイトコードにおける データ依存解析手法の提案と実装
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
ソフトウェアプロダクト集合に対する 派生関係木の構築
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
メソッドの同時更新履歴を用いたクラスの機能別分類法
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
複雑度メトリクスを用いた JAVAプログラム品質特性の実験的評価
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
回帰テストにおける実行系列の差分の効率的な検出手法
木構造の比較に基づく メソッド呼び出し履歴の変化の可視化手法
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
オブジェクト生成の観測に基づく プログラム実行の要約の抽出
Presentation transcript:

Javaプログラムの コールスタック状態に着目した 実行履歴の対話的な分析ツール 大阪大学大学院 情報科学研究科 井上研究室 ZHAO ZEAN

研究概要 Javaプログラムの実行履歴をコールスタック情報に基づいて木構造で可視化するツールを作る ツールの有用性を検証する 木構造に沿って実行時情報の探索 同じコールスタック状態の実行断片検索 検索結果から木構造上位置の逆探索 ツールの有用性を検証する

研究背景 ソフトウェアを開発・保守するため,開発者にとって既存プログラムへの理解が重要である 理解のため,プログラムを動作させることが重要 変数の値などの実行時情報が必要

既存手法(1/2) ブレイクポイント Omniscient Debugging [1] 位置を指定して実行を停止させ,コンピュータ状態を入手する 操作が複雑で効率が悪い,かつ前戻りできない Omniscient Debugging [1] 実行履歴を記録し擬似実行を行い,逆向き実行を可能とした 表示情報はブレイクポイントと同じく,ある時点のコンピュータ状態のみで,プログラムの全体像がつかみにくい [1]Bil Lewis. Debugging backwards in time. In Proceedigns of the International Workshop on Automated Debugging, 2003.

既存手法(2/2) Dynamic Object Process Graph [2] 実行ログを取って,1つオブジェクトに対しメソッドの呼び出し系列を抽出して実行経路を可視化する メソッドの呼び出し関係の可視化のため,実行時情報が省略され,かつ同じメソッドの複数回実行が同じノードに吸収されて比較できない Repeatedly-Executed-Method Viewer [3] seloggerで実行ログを取って,同じメソッドの複数回実行を抽出して表示し比較させる コールスタック状態に関係なく混ざり,使い方を限定した実行だけ調べたいときは使いにくい [2] Jochen Quante and Rainer Koschke. Dynamic object process graphs. Journal of Systems and Software, Vol. 81, No. 4, pp. 481-501, 2008. [3] Toshinori Matsumura, Takashi Ishio, Yu Kashima, and Katsuro Inoue. Repeatedly- executed-method viewer for efficientvisualization of execution paths and states in java. In Proceedings of the 22nd IEEE International Conference on Program Comprehension, pp. 253-257, 2014.

提案手法 既存手法の欠点を補うため 以上のことを可能にするため,本研究のツールを作る 実行履歴に対し,メソッド呼び出しの階層構造を表現したコールツリーを構築し,対話的に探索させる 同一のコールスタック階層を持つメソッドの呼び出しを検索可能とする.似たような状況での実行の対照比較を可能できる 以上のことを可能にするため,本研究のツールを作る

ツールの概要 本研究のツールはseloggerの出力である実行ログファイルを入力として,2ステップを経てGUI画面で実行イベントのコールツリーを表示する step0:seloggerで実行履歴を取る step1:前処理プログラムで実行履歴のデータベース化 step2:ビューアでデータベース内容の表示 ビューアの機能: 木構造に沿って実行時情報の探索 同じコールスタック状態の実行断片検索 検索結果から木構造上位置の逆探索

step0:seloggerについて Javaプログラムの実行履歴を取るためのツール クラスファイルにログファイル出力用のコードを埋め込むバイナリ変換を行い,そのバイナリ変換後のクラスファイルを実行することで実行ログを取る

step1:前処理について ログファイルが配列の形で,かつ何GBになれるため,データベース化よりメモリ使用の軽減,アクセス高速化およびツール開発の簡易化を図る コールスタック状態やメソッドの開始終了位置などの情報はログファイルの含んでいないため,計算して保存しておく必要がある

step1:前処理のコールツリー計算 ログファイルを読む際,左のオートマトンで右のデータ構造を構築する

step2:ビューア画面

step2:UIの説明(1/2) タブ:スレッドごと1枚+検索結果用1枚 中身はコールスタックに基づく実行履歴木 右のウインドウ:イベントの詳細情報 ノード:ログ上のイベント 表示内容はスレッドID, イベント番号と命令 展開した部分:呼び出しごとの メソッド実行 先頭のENTRYにパラメータが, 末尾のEXITに戻り値がある 展開可能ノード:メソッド 呼び出し直前のイベント GUI操作の反応時間計測

step2:UIの説明(2/2) 最初のノードで検索元を提示 結果ごとに部分木が出る 部分木の展開は 元の木と同じ

実験 授業で作ったコンパイラに対しツールを動かすと(約10万イベント),人間が感じられる遅延が生じなかった 実用上最悪ケースの使用可能性を調べるため,DaCapoベンチマークの各プログラムを対象にツールを適用して時間計測を行う 前処理は,出力された実行時間を記録する 木の展開および内容表示は,一番長い区間を20回またはできないまで展開し続け,展開の時間および各区間先頭ノードの詳細内容表示時間を記録する 検査結果からの逆探索動作は計測しづらく,代わりにその核となる番号を与えて自動展開する関数に対し,その実行時間が中心となる実行を百回自動測定する 番号の指定方法は全ノードを線に並び百等分し,区間ごとに代表値を1つランダムに選ぶ

実験環境 コンパイラ:cygwin64のgcc(x86_64-pc-cygwin-gcc.exe,5.4.0バージョン) コンピュータ環境 CPU:Intel Xeon E5-1620,3.6GHz メモリ:DDR3 1600,32GB SSD:SanDisk SDSSDHII,894GB OS:Windows 7 Professional SP1,64bit

結果1(前処理の出力サイズ) 前処理の入出力サイズについては線形関係が見られる データベース化による追加情報量はログファイルのサイズにほぼ比例する

結果1(前処理の時間) 前処理の時間は出力サイズに線形関係が見られる 前処理速度のボトルネックがハードディスクの書き込み速度である SSDでなく機械ハードディスクで実行すれば何倍も遅くなる

結果2 (ビューアの起動と詳細の表示) データベース化による高速アクセスが成功した ビューアの起動時間はDBサイズに関係なく,常に何十msである ノード詳細情報の表示時間はDBサイズに関係なく,常に何msである データベース化による高速アクセスが成功した

結果2(木の展開時間) 木の展開時間はDBサイズとの関連が見られない.実験中,測定不能(10分以上)のケースは1つあった 木の展開時間はその際追加するノード数に依存するため,ループの長い部分は展開不能となる 一番長い区間を意図的に展開しようとしても,1つ特例を除き展開不能の部分に遭わず,そのうち時間の最大値が1分以内に収まり,大多数は100ms以内に収まる 10プログラムの計175実行ケースの時間を ソートしてプロットした図,下は対数軸

結果3(自動展開関数の時間) 一番小さい実行例(イベント数163万程度,DBサイズ0.5GB程度)に対し番号を与えて自動展開関数の実験を行うと,最大時間が約55sである 対話的な実行を保証できる上限に近い その時の前処理時間が1分くらいで,十分速い シナリオどおり100実行ケースの 時間をソートしてプロットした図

結果3(展開不能について) 展開不能ノードのある実行例に対し自動展開関数の実験を行うと,1分以内で終わったケースは21個だけ 展開不能ノードは多数のノードを隠している 自動展開不能ノードのうち,展開不能ノードに遭ったケース以外,長い連続領域に遭ったケースがある ループの長い実行より生じたもので,応用上回避できる

結論 本研究でJavaプログラムの実行履歴をコールスタック情報に基づいて木構造で可視化するツールを作った 実験の結果,GUI操作は長いループに対応できないが,プログラムを理解するための実行でループ回数少なくすることが予想され,目安としてイベント数が163万くらいに収められれば,GUI動作の時間が1分以内に収められ,十分対話的に使えると考えられる 演習のプログラムには十分であるが,長時間動作し続けるプログラムには適用しにくい

今後の課題 イベント系列の構造を可視化するが,表示した詳細内容についてはソースコードやJVMに対する事前知識がないと理解しにくいため,既存の可視化ツールとの連結が考えられる コールスタックを中心に検索する機能を実装したが,オブジェクトやデータ内容を中心に検索できるような機能の拡張が考えられる