Debugging 如何在OCaml中跟踪调试程序?
我有一个关于编码实践的一般性问题 调试时,在我的代码的某个点,我需要一些代码来打印当前状态;当我不调试时,我不想把代码留在那里,因为它会影响其他代码的可见性 很难将它们打包成一个函数,因为大多数情况下,它涉及局部变量,我不想将所有内容都作为参数传递Debugging 如何在OCaml中跟踪调试程序?,debugging,coding-style,ocaml,Debugging,Coding Style,Ocaml,我有一个关于编码实践的一般性问题 调试时,在我的代码的某个点,我需要一些代码来打印当前状态;当我不调试时,我不想把代码留在那里,因为它会影响其他代码的可见性 很难将它们打包成一个函数,因为大多数情况下,它涉及局部变量,我不想将所有内容都作为参数传递 那么,您通常如何管理这种“打印/检查”代码?有什么好的做法吗?我经常使用一个调试函数,它只在调试标志设置为true时才打印值: let debug_flag = ref false let debug fmt = if !debug_flag
那么,您通常如何管理这种“打印/检查”代码?有什么好的做法吗?我经常使用一个调试函数,它只在调试标志设置为true时才打印值:
let debug_flag = ref false
let debug fmt =
if !debug_flag then Printf.eprintf fmt
else Printf.ifprintf stderr fmt
我以前有一个调试函数,只有在设置了标志的情况下才打印最终字符串。现在,我只想添加
if
语句:
- 它们不长了
- 如果条件为false,则不会计算任何内容
- 阅读代码时很容易看出它只是用于调试
if
语句,但它只在使用camlp4的项目中起作用,我现在倾向于避免使用它
请注意,通常,我使用的不是一个调试标志,而是许多调试标志,每个模块一个,然后是元标记,它们将触发多个模块或正交方面的调试。它们作为标志列表放在哈希表中,我可以用参数或环境变量设置它们。我使用日志语法扩展: 您还可以使用
Loc.start\u line\u Loc
(也许我会添加它)将行号传递给日志功能(在上面的源代码中硬编码为AuxIO.log
)
注意,条件应该是语法扩展的一部分,这样,如果不需要打印参数,它就不会计算参数。此外,我们还有灵活的“printf”语法
此外,我在Emacs中使用了一个命令:
(defun camldev-insert-log-entry ()
(interactive)
(insert "(* {{{ log entry *)
LOG 2 \"\";
(* }}} *)")
(goto-char (- (point) 12)))
与“折叠模式”一起使用。问题是。。。我想打印的内容包括几行,涉及许多局部变量……这个调试函数的问题是,参数总是被计算出来的,即使在最后没有使用它们。