¿Cómo obtengo un seguimiento de pila en OCaml?
-
02-07-2019 - |
Pregunta
El lenguaje de Objective Caml solo producirá trazas de pila si las solicita de forma correcta. ¿Cuáles son los requisitos tanto para el código de bytes como para el código nativo?
Solución
Compile con -g y establezca la variable de entorno OCAMLRUNPARAM = b
Otros consejos
Algunas funciones de Printexc te permiten hacer esto programáticamente .
Debido a que parece que solo puede obtener rastros para excepciones en Unix, puede bifurcar y lanzar la excepción en el segundo proceso. De esta manera el proceso principal puede continuar:
export OCAMLRUNPARAM=b
# compile with -g
flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
Si está usando Ocamlbuild en lugar de invocar el compilador directamente, puede usar la etiqueta debug
. Del manual :
Con OCamlbuild, simplemente puede agregar la etiqueta de depuración a los objetivos de su programa, y ??se ordenará cuándo insertar la marca -g o no.
Por ejemplo, si está creando un archivo foo.ml
con el paquete bar
, entonces su archivo _tags
tendrá una línea:
<foo.ml>: package(bar), debug
Esto insertará los indicadores -g
apropiados al construir el código de bytes / archivos nativos. Sin embargo, aún debe configurar la variable de entorno utilizando export OCAMLRUNPARAM = b
como se menciona en las otras respuestas.