Come posso ottenere una traccia dello stack in OCaml?
-
02-07-2019 - |
Domanda
Il linguaggio Objective Caml produrrà tracce di stack solo se le richiedi nel modo giusto: quali sono i requisiti sia per bytecode che per codice nativo?
Soluzione
Compilare con -g e impostare la variabile d'ambiente OCAMLRUNPARAM = b
Altri suggerimenti
Alcune funzioni Printexc ti consentono di farlo a livello di codice .
Poiché sembra che puoi ottenere tracce solo per le eccezioni su unix, puoi eseguire il fork e generare l'eccezione nel secondo processo. In questo modo il processo principale può continuare:
export OCAMLRUNPARAM=b
# compile with -g
flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
Se stai usando Ocamlbuild invece di invocare direttamente il compilatore, puoi usare il tag debug
. Dal manuale :
Con OCamlbuild, puoi semplicemente aggiungere il tag di debug ai target del tuo programma e risolverà quando inserire il flag -g oppure no.
Ad esempio, se stai creando un file foo.ml
con il pacchetto bar
, il tuo file _tags
avrà una riga:
<foo.ml>: package(bar), debug
Questo inserirà i flag -g
appropriati durante la creazione di bytecode / file nativi. Tuttavia, è ancora necessario impostare la variabile di ambiente utilizzando export OCAMLRUNPARAM = b
come indicato nelle altre risposte.