20

I have looked through the SMLNJ User Guide and can't find anything about debugging capabilities. I'd love to just see a stack trace, or step through a function. Is this possible. Are there other implementations for similar variants of SML that do provide this feature?

Kai
  • 3,997
  • 4
  • 30
  • 36

4 Answers4

13

There's currently no step-based debugger.

You can get stack backtraces by doing the following:

- 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
-

Then, you can load some code and instead of just printing the exception, you'll get a simulated stack backtrace. You do have to recompile your code after following the above steps, or this won't work!

- 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
-
Lars Bergstrom
  • 807
  • 7
  • 13
9

There is now a source level debugger in PolyML: http://www.polyml.org/documentation/Tutorials/Debugging.html

Community
  • 1
  • 1
Paulo Matos
  • 1,614
  • 17
  • 23
7

From section 3.3 of the SMLNJ faq:

Q: Is there a debugger for SML/NJ? What ever happened to Tolmach's debugger for SML/NJ 0.93?

A: The short answer is no.

Also:

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

There's a .NET compiler, though, which claims to have some debugging support..

stuartd
  • 70,509
  • 14
  • 132
  • 163
  • 1
    Your "Also" Berkeley link is dead (unsurprisingly - it seems to have referenced some kind of Google cache of a website accessed by a direct IP instead of a domain name) – iono Mar 01 '21 at 17:20
4

Poly/ML is the best unknown implementation of Standard ML. It had a command-line debugger from early on (at least the 1990s). Recently, it has acquired full IDE support via Isabelle/PIDE, e.g. see ML, which also includes a source-level debugger.

Makarius
  • 2,165
  • 18
  • 20