Comment puis-je obtenir une trace de pile dans OCaml?

Le langage Caml Objective ne produira des traces de pile que si vous les demandez correctement - quelles sont les exigences pour le bytecode et le code natif?

24
demandé sur Thelema 2008-09-28 17:53:16

4 réponses

Compiler avec -g et définir la variable D'environnement OCAMLRUNPARAM = b

35
répondu Thelema 2008-09-28 13:56:53

Certaines fonctions Printexc vous permettent de le faire par programmation.

9
répondu Tobu 2010-02-01 15:05:16

Comme il semble que vous ne puissiez obtenir que des traces pour les exceptions sous unix, vous pouvez bifurquer et lancer l'exception dans le second processus. De cette façon, le processus principal peut continuer:

export OCAMLRUNPARAM=b
# compile with -g

flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
2
répondu Marc Weber 2013-06-23 00:54:04

Si vous utilisez Ocamlbuild au lieu d'appeler directement le compilateur, vous pouvez utiliser la balise debug. Du manuel :

Avec OCamlbuild, vous pouvez simplement ajouter la balise de débogage aux cibles de votre programme, et il va trier quand insérer l'indicateur-g ou non.

Par exemple, si vous construisez un fichier foo.ml avec le paquet bar alors votre fichier _tags aura une ligne:

<foo.ml>: package(bar), debug

Cela insérera les drapeaux -g appropriés lors de la construction bytecode/fichiers natifs. Cependant, vous devez toujours définir la variable d'environnement en utilisant export OCAMLRUNPARAM=b comme mentionné dans les autres réponses.

0
répondu theindigamer 2017-07-30 03:23:25