Die Sprache Objective Caml erzeugt nur dann Stack Traces, wenn man sie richtig anfordert - was sind die Anforderungen für Bytecode und nativen Code?
Antworten
Zu viele Anzeigen?Da es so aussieht, als ob man unter Unix nur Traces für Ausnahmen erhalten kann, kann man sich aufteilen und die Ausnahme im zweiten Prozess auslösen. Auf diese Weise kann der Hauptprozess weiterlaufen:
export OCAMLRUNPARAM=b
# compile with -g
flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
Wenn Sie Ocamlbuild verwenden, anstatt den Compiler direkt aufzurufen, können Sie die debug
Tag. Vom Handbuch :
Mit OCamlbuild können Sie einfach das Debug-Tag zu den Zielen Ihres Programms hinzufügen, und es wird herausfinden, wann das Flag -g einzufügen ist oder nicht.
Zum Beispiel, wenn Sie eine Datei erstellen foo.ml
mit Paket bar
dann Ihr _tags
Datei wird eine Zeile enthalten:
<foo.ml>: package(bar), debug
Dadurch wird die entsprechende -g
Flags bei der Erstellung von Bytecode/nativen Dateien. Allerdings müssen Sie die Umgebungsvariable noch mit export OCAMLRUNPARAM=b
wie in den anderen Antworten erwähnt.
Wie in anderen Antworten erwähnt, müssen Sie Ihr Projekt mit Debugging-Informationen kompilieren und es mit dem OCAMLRUNPARAM=b
Umgebungsvariable.
Ein bequemer Weg, um Ocamlbuild ein ganzes Projekt mit Debugging-Informationen kompilieren zu lassen, ohne die _tags
Datei ist die Angabe eines speziellen Debug-Ziels. Aus der Handbuch :
Der bevorzugte Weg, Code zu kompilieren, der für das Debugging mit
ocamldebug
oder Profiling von nativem Code mitocamlprof
ist es, die entsprechenden Zielerweiterungen zu verwenden,.d.byte
für die Fehlersuche oder.p.native
.
Ich verwende diese Technik für schnelle Kompilier-Lauf-Zyklen in der Befehlszeile. Zum Beispiel, um foo.ml
:
export OCAMLRUNPARAM=b
ocamlbuild -no-links foo.d.byte && _build/foo.d.byte