2009-04-18 2 views
16

Ich habe durch die SMLNJ User Guide geschaut und kann nichts über Debugging-Funktionen finden. Ich würde gerne nur einen Stack-Trace sehen oder durch eine Funktion gehen. Ist das möglich. Gibt es andere Implementierungen für ähnliche Varianten von SML, die tun bieten diese Funktion?Hat SMLNJ irgendeine Art von Debugger?

Antwort

8

Aus Abschnitt 3.3 des SMLNJ faq:

Q: Gibt es einen Debugger für SML/NJ? Was passiert mit Tolmachs Debugger für SML/NJ 0.93?

A: Die kurze Antwort ist nein.

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 

dort ist a .NET compiler, obwohl, die einige Debug-Unterstützung haben behauptet ..

10

Es gibt derzeit keine basierte Schritt Debugger.

Sie können Stapel Backtraces erhalten, indem Sie folgendermaßen vorgehen:

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

Dann können Sie einen Code und statt nur die Ausnahme Druck laden, werden Sie einen simulierten Stapel Backtrace bekommen. Sie müssen Ihren Code neu kompilieren, nachdem Sie die obigen Schritte ausgeführt haben, oder das wird nicht funktionieren!

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

Poly/ML ist die beste unbekannte Implementierung von Standard ML. Es hatte einen Command-Line-Debugger von Anfang an (mindestens die 1990er Jahre). Kürzlich hat es vollständige IDE-Unterstützung über Isabelle/PIDE, z. siehe ML, die auch einen Debugger auf Quellcodeebene enthält.