Comment obtenir une trace de pile dans OCaml?
-
02-07-2019 - |
Question
Le langage Objective Caml ne produira des traces de pile que si vous les demandez exactement - quelles sont les exigences pour les codes à la fois et le code natif?
La solution
Compilez avec -g et définissez la variable d'environnement OCAMLRUNPARAM = b
Autres conseils
Certaines fonctions Printexc vous permettent de le faire par programmation. .
Comme il semblerait que vous ne puissiez obtenir des traces que des exceptions sous unix, vous pouvez créer une exception et la placer 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
Si vous utilisez Ocamlbuild au lieu d'appeler directement le compilateur, vous pouvez utiliser la balise debug
. Sur le manuel :
Avec OCamlbuild, vous pouvez simplement ajouter la balise de débogage aux cibles de votre programme. Elle déterminera quand insérer ou non le drapeau -g.
Par exemple, si vous créez un fichier foo.ml
avec le package bar
, votre fichier _tags
aura une ligne:
<foo.ml>: package(bar), debug
Ceci insérera les indicateurs -g
appropriés lors de la création de fichiers en code-octet / natifs. Cependant, vous devez toujours définir la variable d'environnement à l'aide de export OCAMLRUNPARAM = b
comme indiqué dans les autres réponses.