如何跟踪OCaml中的调试程序?

时间:2012-02-24 06:45:22

标签: debugging coding-style ocaml

我对编码实践有一般性问题......

在调试时,在我的代码的某些时候,我需要一些代码来打印当前状态;当我不调试时,我不想将代码保留在那里,因为它会妨碍其他代码的可见性......

很难将它们打包成一个函数,因为大部分时间它都涉及局部变量,而且我不想将所有内容都作为参数传递...

那么你如何管理这种“打印/检查”代码呢?有什么好的做法吗?

3 个答案:

答案 0 :(得分:6)

我曾经有一个调试函数,只有在设置了一个标志时才会打印最终的字符串。现在,我更愿意添加if语句:

  • 他们不再长久
  • 没有计算条件是假的
  • 在阅读代码时很容易看到它只用于调试

我也曾经有过camlp4宏,它会从函数应用程序中生成if语句,但它只适用于使用camlp4的项目,我现在倾向于避免使用它。

请注意,通常,我不使用一个调试标志,而是使用许多调试标志,每个模块一个,然后是meta标签,它们将触发几个模块或正交方面的调试。它们作为标志列表放在哈希表中,我可以使用参数或环境变量来设置它们。

答案 1 :(得分:5)

我经常使用调试函数,只有在调试标志设置为true时才打印值:

let debug_flag = ref false

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

答案 2 :(得分:4)

我使用日志语法扩展名:

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

您还可以使用AuxIO.log将行号传递给日志功能(在上面的源代码中硬编码为Loc.start_line _loc)(也许我会添加它)。

请注意,条件应该是语法扩展的一部分,这样如果它不需要打印它们就不会计算参数。此外,我们有灵活的“printf”语法。

另外,我在Emacs中使用命令:

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

与`折叠模式'一起。

相关问题