goccyでごっしー

技術的な話題をつらつらと書いたり書かなかったり

これからのアプリケーションデバッグについて思う

最近はiOSアプリケーションの開発がメインの業務になっていて、毎日延々とUIなどの開発をしていると、デバッグ環境がどうにかならんものかと思ってくる。

ある画面Cを開発しようと思ったときに、画面A->画面B->画面Cと画面遷移をして...といった作業が無駄すぎるからだ。画面A->画面BにいくためにボタンA、ボタンBを押して〜とかなってくると更に大変で、本来のデバッグ対象画面に辿りつくまでに、相当量の時間を無駄にしているように思える。

そこで、これを解決できたら結構面白いかなと考えて、学生のときに同じことを思って修論にしたアイディアをPerlMotionに実装したいなと思ったわけです。

 

ようはCheckPoint機能の実装をしようという話で、任意の状態をCheckPointとして記録しておき、アプリケーションを再起動するときに、一気に記録したCheckPointまでアプリケーションの状態を進めるという感じです。「任意の状態」というとなんだかこむずかしそうだけれども、ようは、「最初」から「任意の状態」にいたるまでのアプリケーションの状態を決定づける要素を全て保存していって、アプリケーション起動時に保存した情報を同じ順番で流しこめば、原理的に再現できるだろうと思うわけです。

 

アプリケーションの状態を決定づけるには、アプリケーションの振る舞いを変化させるものを追っていけばいいという前提で話を進めると、追うべき対象というのは、広義には「Event」なのかなと思っている。「Event」にはユーザーが画面をタップしただとか、HTTP通信だとかそういうものが入ってくると思っていて、言い換えれば、アプリケーションに対する外部からの干渉行為みたいなものだ。ここでいうEventをうまく定義できて、もれなく保存していけば、アプリケーションの状態は再現できると思う。

 

上のようなことを修論のときに書いて、自作エディタにCheckPointの設定機能をつけて、Qtアプリケーションの任意の状態を再現するというデモを作った。当時、なんとなく動いた感があったので、同じような機能をPerlMotionにくっつけたいなーと思っている次第です。

PerlMotionではiOS SDKが提供するAPIをラップする構成になっているので、イベントを保存する処理みたいなのを簡単にInjectできる。なので、これはいけるんじゃないかと思ってるわけです。

 

CheckPointがうまく動くようになれば、一度保存しさえすればアプリケーションの状態を過去・未来のいかなる状態にも一発で遷移させることができて、大分デバッグが快適になる気がしています。アプリケーションの時間軸を操作している気分になれて、なんだかタイムマシンみたいで良いですね。(コードを変えるとタイムパラドックスが起きて過去や未来の状態が変わるなんてことも起こりそうです)

 

というわけで、タイムマシンを作ろうと思っています。