39 Stimmen

Wie erhalte ich einen Stack-Trace in OCaml?

Die Sprache Objective Caml erzeugt nur dann Stack Traces, wenn man sie richtig anfordert - was sind die Anforderungen für Bytecode und nativen Code?

46voto

Thelema Punkte 13287

Kompilieren Sie mit -g und setzen Sie die Umgebungsvariable OCAMLRUNPARAM=b

11voto

Tobu Punkte 23823

Einige Printexc Funktionen können Sie dies programmgesteuert tun.

5voto

Marc Weber Punkte 481

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

3voto

typesanitizer Punkte 2144

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.

0voto

Jay Lieske Punkte 4568

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X