2012-02-24 10 views
9

コーディングに関する一般的な質問があります...OCamlでデバッグ用のプログラムをトレースする方法は?

デバッグ中に、私のコードのある時点で、現在の状態を出力するコードが必要です。私がデバッグしないとき、私は他のコードの可視性を邪魔するので、そこにコードを残したくない...

ほとんどの時間、それはローカル変数を含むので、それらを1つの関数にパッケージ化するのは難しい、と私は

それでは、どのようにあなたは、一般的に「印刷/チェック」この種のコードを管理しない...引数として、すべてを渡したくありませんか?何か良い練習はありますか?フラグのみだった場合にのみ、最終的な文字列を印刷し、私はデバッグ機能を持っていた

let debug_flag = ref false 

let debug fmt = 
    if !debug_flag then Printf.eprintf fmt 
    else Printf.ifprintf stderr fmt 

答えて

5

セット。今、私はちょうどif文を追加することを好む:

  • 、彼らははるかに長くはありません
  • 計算され
  • 何も条件が偽ではありません
  • それが唯一のデバッグ用であることを確認するために、コードを読みながら、それは簡単です

私はまた、機能アプリケーションからif文を生成するCamlp4のマクロを、持っていた、それだけで私は、今日避ける傾向にあるCamlp4のが使用されているプロジェクトで動作します。

通常、私は1つのデバッグフラグではなく、モジュールごとに1つのデバッグフラグを使用し、いくつかのモジュールまたは直交面のデバッグをトリガーするメタタグを使用します。それらはフラグのリストとしてハッシュテーブルに入れられ、引数または環境変数のいずれかでそれらを設定できます。

私はログ構文拡張を使用
+0

私が印刷したいものはいくつかの行をカバーし、多くのローカル変数を含んでいます... – SoftTimur

+1

このデバッグ関数の問題は、最後に使用されていなくても引数が常に計算されるということです。 –

6

、:

私は、多くの場合、デバッグフラグがtrueに設定されている場合にのみ値を出力し、デバッグ機能を使用し
4

http://toss.svn.sourceforge.net/viewvc/toss/trunk/Toss/caml_extensions/pa_log.ml?revision=1679&view=markup

あなたはまたLoc.start_line _loc(おそらくI'LLを使用して(上記のソースにAuxIO.logにハードコードされている)ロギング機能に行番号を渡すことができますそれを追加する)。

条件式は構文拡張の一部でなければならないことに注意してください。この方法では、引数を計算する必要がない場合は計算されません。また、柔軟な "printf"構文もあります。

はまた、私はEmacsでコマンドを使用します。

(defun camldev-insert-log-entry() 
    (interactive) 
    (insert "(* {{{ log entry *) 
LOG 2 \"\"; 
(* }}} *)") 
    (goto-char (- (point) 12))) 

一緒 `折りたたみモード」で。

関連する問題