Die Objective-Caml-Sprache erzeugt nur dann Stack-Traces, wenn Sie genau danach gefragt haben - was sind die Anforderungen für Bytecode und nativen Code?Wie bekomme ich einen Stack-Trace in OCaml?
Antwort
Compile mit -g und Umgebungsvariable OCAMLRUNPARAM = b
Einige Printexc Funktionen können Sie dies programmatisch tun.
Speziell 'Printex.record_backtrace wahr '. –
Da es so aussieht, als könnten Sie nur Traces für Exceptions unter Unix erhalten, können Sie forcieren und die Exception im zweiten Prozess auslösen. Auf diese Weise der Hauptprozess fortgesetzt werden kann:
export OCAMLRUNPARAM=b
# compile with -g
flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
Wenn Sie mit Ocamlbuild anstatt direkt aufrufen Compiler, können Sie die debug
Tag verwenden. Vom manual:
Mit OCamlbuild, können Sie einfach die Ziele des Debug-Tag zu Ihrem Programm hinzufügen, und es wird in Ordnung bringen, wenn die Option -g oder nicht einfügen.
Zum Beispiel, wenn Sie eine Datei foo.ml
mit Paket Aufbau bar
dann _tags
Datei eine Zeile haben:
<foo.ml>: package(bar), debug
Dadurch werden die entsprechenden -g
Flaggen einsetzen, während Bytecode/native Dateien zu bauen. Sie müssen die Umgebungsvariable jedoch weiterhin mithilfe von export OCAMLRUNPARAM=b
festlegen, wie in den anderen Antworten erwähnt.
Für nativen Code, glaube ich, dass dies nur für OCaml v3.10 oder später funktioniert. –