第 336 回 PTT のお知らせ


日時:2007年 9月27日(木) 18:30 から


場所:慶應義塾大学 矢上キャンパス 14棟-201教室(セミナールーム1)(地図の3番の建屋)



話者:
孝壽 俊彦(慶應義塾大学大学院 高田研究室 後期博士課程3年)


話題:
仮想マシンを利用したプログラム実行の監視と, そのデバッガへの応用

概要:
プロセス仮想マシンを利用したプログラム実行制御・監視環境を紹介する. プロセス仮想マシンとはユーザプロセスを実行するための仮想マシンであり, 発表者はこれをデバッガの基盤環境として応用することについて研究している (注). (注) (Java VM のような) C 言語のプログラムを実行できる仮想マシンを作成し, (JVMDI のような) デバッガのためのインターフェースをつけたものです. 本発表では,この基盤環境を利用して, 実際に開発を行っているデバッガについても紹介する. 本デバッガには,プログラムスライシングや可逆実行など, デバッグに有用な様々な機能が組込まれている. 本発表ではこれらの機能を用い, Apache HTTP Server などに含まれていた実際のバグを デバッグするシナリオについて紹介する.



第 336 回 PTTメモ

出席者:20名

和田英一(IIJ)、伊知地宏(ラムダ数教研)、日比野啓(朝日ネット)、
田中哲朗(東京大)、首藤一幸(ウタゴエ)、古山大輔、山口文彦(東京理科大)、
仁科宏一、篠沢佳久、飯島正(慶應大)、樋口直志(NEC)、匿名希望、
三廻部大(日本IBM)、酒井政裕(東芝)、阿部正佳(フリー)、
小林弘明(元電通大)、今井祥子、多田好克、寺田実、丸山一貴(電気通信大)


質疑応答:

Q: ジャンプ命令を変換した後はどうなるのか?
A: キャッシュ内の変換したコード片を分岐命令で直接つないでいく.

Q: 同じ命令を複数のコード片に散らばらせる必要はないのでは?
A: 将来的に変換したコード片内で最適化を行いたいため,
   single-entry single-exit を維持したい.

Q: 再生するというのがわからない
A: 例えば time() システムコールでは,最初の実行時の戻り値を記録しておき,
   2 回目以降の実行ではその戻り値を返す.
   シグナルやスレッドのコンテキストスイッチもタイミングを記録・再生する.

Q: プリエンプションのタイミングはどう決めているのか?
A: ユーザが指定できる.
   デフォルトでは毎回乱数で決めるコード量を実行後にスイッチ.

Q: 可逆実行で,チェックポイントを記録し,再実行する方式はどうなのか?
A: それは実装を検討している.
   仮想マシンと仮想マシン上のプログラムをどう切り分け,
   チェックポイントを取って行くかが課題.

Q: デバッグシナリオは Apache HTTP Server だけなのか?
A: 今回発表したのは Apache のみだが,他にもいくつか試している.

Q: GDB とどこが違い、どこがいいのか?
A: 単純な機能だけで見ると,スライシングや逆実行などができるところ.

Q: GDB のプログラムインターフェースで同様のことはできないか?
A: ptrace() でステップ実行をすることになるので,実用的な速度では不可能.

Q: 仮想マシンは機械語コードを実行するので, C 言語に限定する必要がないのでは?
A: 仮想マシン自体は基本的に問題ないはず.
   実際にライブラリの動的ロードや動的リンクなどの低レベル処理も実行できる.
   問題はむしろデバッガ側の対応.

Q: 仮想マシン内でオリジナルのコードアドレスはどう扱うのか?
A: 例えば関数の呼び出しでは,オリジナルプログラムの戻りアドレスを,
   オリジナルプログラムのスタックに積む.
   関数の復帰では,オリジナルプログラムの戻りアドレスを読みだして,
   そのアドレスのコードを変換して実行して行く.

Q: 全部自分でやったのか?
A: 仮想マシンの開発という意味では全部自分でやった.
   もちろん (他の用途の) プログラムから拝借したコードは結構ある.

Q: デバッカ以外につかえないのか
A: 様々な用途があると思うが (プロファイラ,サンドボックス etc),
   主眼としており,一番適しているのはデバッガ.

Q: デバッガの名前は?
A: 完全に決定ではない & 恥ずかしいので内緒.

Q: 実行時に生成されるコードは?
A: 仮想マシンで変換した後に,そのコードが変更される場合などは未対応.

Q: Apache のバグはすでにわかっているバグでやったのか?
A: バグレポートに既に登録されているバグから探した.

Q: デバッガにバグはないのか?
A: 多分いっぱいある.

Q: GUI プログラムへの対応はどうなのか?
A: UNIX では, GUI プログラムは X とのソケット通信を行う.
   GUI 用の特別なシステムコールなどはないのでそれは問題ではない.

Q: マルチ CPU には対応できるのか
A: ユーザレベルスレッドなので,
   CPU をまたがったスレッドのスケジューリングは不可能.
   ただし,もしそれができても,
   デバッガの監視コードを再入可能にしなければならないので,割にあうか疑問.

Q:スライスのためのログを逆実行に使えないのか?
A: Forward Computation という計算方法を行っているので,ログを取っていない.

Q: コードサイズはどれくらいなのか?
A: 実際はそんなに大きくない.
   仮想マシンだけなら 25k 行程度.

Q: 修士からやっているのか?
A: 最初はテストの研究をしていた.
   修士 1 年の終りくらいから作り始めた.
   それでももう 3 年以上.