Does SMLNJ have any sort of debugger?

后端 未结 4 2058
梦如初夏
梦如初夏 2021-02-07 05:38

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 possib

4条回答
  •  萌比男神i
    2021-02-07 06:15

    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
    -
    

提交回复
热议问题