SMLNJ有任何一种调试器吗?

20

我已经查看了SMLNJ用户指南,但是没有找到任何关于调试功能的内容。我希望能够查看函数调用栈或者逐步执行函数。这是否可能?是否有其他类似的SML变体实现可以提供这个功能?

4个回答

13

当前尚无基于步骤的调试器。

您可以通过执行以下操作获取堆栈回溯:

- CM.make "$smlnj-tdp/back-trace.cm";
[library $smlnj-tdp/back-trace.cm is stable]
[library $smlnj-tdp/plugins.cm is stable]
[library $SMLNJ-LIB/Util/smlnj-lib.cm is stable]
[library $smlnj/compiler/current.cm is stable]
[library $smlnj/compiler/x86.cm is stable]
[library $smlnj/viscomp/core.cm is stable]
[library $smlnj/viscomp/parser.cm is stable]
[library $smlnj/viscomp/basics.cm is stable]
[library $smlnj/viscomp/elaborate.cm is stable]
[library $smlnj/viscomp/elabdata.cm is stable]
[library $smlnj/MLRISC/MLRISC.cm is stable]
[library $SMLNJ-MLRISC/MLRISC.cm is stable]
[library $Lib.cm(=$SMLNJ-MLRISC)/Lib.cm is stable]
[library $Control.cm(=$SMLNJ-MLRISC)/Control.cm is stable]
[library $Graphs.cm(=$SMLNJ-MLRISC)/Graphs.cm is stable]
[library $smlnj/MLRISC/Control.cm is stable]
[library $smlnj/viscomp/debugprof.cm is stable]
[library $smlnj/viscomp/execute.cm is stable]
[library $smlnj/internal/smlnj-version.cm is stable]
[library $smlnj/viscomp/x86.cm is stable]
[New bindings added.]
val it = true : bool
- SMLofNJ.Internals.TDP.mode := true;
[autoloading]
[autoloading done]
val it = () : unit
-

然后,你可以加载一些代码,而不仅仅是打印异常,你会得到一个模拟的堆栈回溯。在按照上述步骤后,你需要重新编译你的代码,否则这个方法将不起作用!

- exception Foo;
exception Foo
- fun otherFun() = raise Foo;
val otherFun = fn : unit -> 'a
- fun raiseAtZero(n) = if (n > 0) then raiseAtZero(n-1) else otherFun();
val raiseAtZero = fn : int -> 'a
- raiseAtZero 10;
stdIn:9.1-9.15 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)

*** BACK-TRACE ***
GOTO   stdIn:7.5-7.27: otherFun[2]
          (from: stdIn:8.60-8.70: raiseAtZero[2])
CALL-( stdIn:8.5-8.70: raiseAtZero[2]
          (from: stdIn:9.1-9.15: it)
GOTO   stdIn:5.5-5.27: otherFun[2]
          (from: stdIn:6.60-6.70: raiseAtZero[2])
CALL-( stdIn:6.5-6.70: raiseAtZero[2]
          (from: stdIn:6.71-6.86: it)

uncaught exception Foo
  raised at: stdIn:7.24-7.27
-

9

7

SMLNJ faq第3.3节中得知:

问:SML / NJ有调试器吗? Tolmach的SML / NJ 0.93调试器到底发生了什么事情?

答:简短的回答是没有。

此外:

Debugging SML 

    * For years, no one had an SML debugger

    * Why?
          o No one had any bugs?
          o It is hard to write a debugger for SML
          o The user community wasn’t large enough

    * Likely all three are true

然而,有一个.NET编译器声称具有一些调试支持...


1
您的“另外”伯克利链接已失效(不出所料——它似乎引用了通过直接 IP 访问的网站的谷歌缓存)。 - iono

4

Poly/ML 是标准 ML 最好但鲜为人知的实现。它早在 1990 年代就有命令行调试器。最近,通过 Isabelle/PIDE 的完整 IDE 支持,例如查看ML,它还包括源码级调试器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接