Tips

デバッガーでのデバッグの限界

日付2013/08/15
ID13-012
バージョン13
プラットフォームWindows, Mac

4Dのデバッガーは非常に強力なツールだと言えます。そして多くのデベロッパーは、このデバッガーで多くの問題を解決しているに違いありません。しかしデバッガーによるデバッグにも限界があります。

次のような場合、デバッガーによるデバッグは適切ではない可能性があります。

また、コンパイルやビルドされたアプリケーションではデバッガーを使うことができません。

デバッガーの限界

フォームイベントによる処理のデバッグは、デバッガーを使えないことがあります。デバッガーを表示することで、表示中のフォームに余計なフォームイベントが発生するからです。また、フォームを表示するために開くウィンドウタイプによっても、デバッガーが使えなくなることが有ります。最悪は、4Dを終了することができなくなります。

Webプロセスのデバッグでは、Webサーバでデバッガーが表示されることになりますし、また複数のWebリクエストによって複数のプロセスでデバッガーが起動されたり、さらにデバッグ中にWebブラウザのタイムアウトが発生してしまったりと、思うようにデバッグできないことが多いでしょう。

しかし意外と知られていないのは、変数の定義をしていないメソッドのデバッグにデバッガーが使えないことがあることです。

4Dのインタープリターと同じようにデバッガーも動作しますが、通常のインタープリターと全く同じではなく、デバッガーはウィンドウ上に様々な情報を表示できるように準備します。そのため変数定義をしていないメソッドの場合、非常に稀ですが、インタープリターと全く同じ振る舞いにならないことがあります。

デバッガー以外のデバッグ方法

デバッガーが使えない時には、他のデバッグ方法を利用します。

デバッグにALERTコマンドを使うことをよく見かけますが、ALERTコマンドを使うぐらいなら、デバッガーの方が便利ですし、ウィンドウオブジェクトのデバッグに使えない点でデバッガーと同じと言えます。むしろ無限ループに陥った時などは抜け出す方法が無いので、デバッガーよりもALERTコマンドは厄介かもしれません。

ALERTコマンドを使うのであれば、むしろSET TEXT TO PASTEBOARDコマンドの方が有用でしょう。SET TEXT TO PASTEBOARDコマンドを有用に使うには、デザインモードの編集メニューにある「クリップボード表示」を選択して表示されるウィンドウを他のウィンドウに隠されない位置に表示しておくことで、SET TEXT TO PASTEBOARDコマンドが実行された時、直ちにクリップボードの内容を確認することができます。この方法であれば、余計なウィンドウイベントを発生することが無いので、4Dのフレームワークとコンフリクトすることもありません。

そして最も有用なのは、デバッグログを使うことです。デバッグログは、データベースフォルダ内のLogsフォルダに動作ログを記録するもので、ログにはメソッド名を始め様々な動作が記録されます。デバッグログを通して、不可解な振る舞いが何故発生したのか、または正しく動作しているか解析できます。特に変数を定義していないメソッドのデバッグでは、大いにデバッグログが価値を発揮すると思います。また、隠し機能でいつでも入/切できるようにしておくことで、運用中のコンパイルやビルドされたアプリケーションでもデバッグが可能になります。

デバッグログの記録を開始するには次のようにします。

SET DATABASE PARAMETER(Debug Log Recording;3)

デバッグログの記録を終了するには次のようにします。

SET DATABASE PARAMETER(Debug Log Recording;0)

デバッグログはマシン単位で記録され、そのマシンの全ての動作が記録されます。つまりSET DATABASE PARAMETERコマンドを実行した時点で、実行したプロセスだけでなく、全てのプロセスの動作がログファイルに記録されます。

デバッグログはLogsフォルダ内に作成されます。サーバのデバッグログはデータベースフォルダ内のLogsフォルダになりますが、リモート接続のクライアントのデバッグログはキャッシュフォルダ内のLogsフォルダに作成されます。次のコードを実行すると、サーバ/クライアント/スタンドアローンの区別なく、フォルダを簡単に開くことができます。

SHOW ON DISK(Get 4D folder(Database Folder)+"Logs")

デバッグログはテキストファイルですので、テキストファイルを見ることのできるエディタで開いて内容を確認できます。ログファイルのフォーマットは仕様が確定されていないので、リファレンス等には記載がありませんが、現時点(将来変更されるかもしれません)では次のようになっています。

・各行の区切りは、CRLF
・第1行目にログ記録開始の時刻(SET DATABASE PARAMETERの実行時刻)
・第1行目の括弧内はログのリファレンス番号
・第2行目からログ
・ログの各行のフォーマットは次の通り
  ・最初の数字はログ記録開始からのミリ秒
  ・p=プロセス番号
  ・puid=プロセスID
  ・実行の種類
    Log lebel:ログ記録開始時のレベル
    meth: メソッドの実行
    cmd: コマンドの実行
    obj: オブジェクトイベント
    end_obj: オブジェクトイベントの終了
    form: フォームイベント
    end_form: フォームイベントの終了
  ・パラーメータ等の情報
  ・最後に括弧があるときはメソッド名やオブジェクト名等の呼出し元の名前
  ・セレクタが4の時には各行の末尾に実行に費やした時間(ms)
   注:セレクタ4は現時点で実験的な実装のため将来変更される可能性があります

まとめ

4Dには優れたデバッガーがあるので、ついデバッガーに頼りがちになりますが、必ずしも万能ではないことを理解してください。デバッガーで上手くデバッグできないときには、デバッガーに頼らず、他のデバッグ方法も活用してください。