Je dispose d'un fichier de test très court:pile d'impression traces
let print_backtrace() = try raise Not_found with
Not_found -> Printexc.print_backtrace stdout;;
let f() = print_backtrace(); Printf.printf "this is to make f non-tail-recursive\n";;
f();
Je compiler et exécuter:
% ocamlc -g test.ml
% OCAMLRUNPARAM=b ./a.out
Raised at file "test.ml", line 1, characters 35-44
this is to make f non-tail-recursive
Pourquoi ne f
répertorié dans la trace de la pile? Comment puis-je écrire une fonction qui va imprimer une trace de pile de l'endroit à partir duquel elle est appelée?
Cela répond à la moitié de ma question, alors merci pour cela. Est-ce que je devrais prendre le silence sur l'autre moitié pour indiquer qu'il n'est pas possible de faire ce que je veux, c'est-à-dire d'imprimer une trace de pile complète et continuer? –
Je ne vois pas un bon moyen de le faire sans piratage sur le runtime OCaml. Peut-être courir sous ocamldebug? Ou puisque vous semblez fonctionner sous Unix, si ce n'est que pour une exécution rapide de dépannage, vous pouvez fork() votre processus et déclencher une exception non capturée dans le processus enfant (qui imprimera une trace de pile complète), puis quitter dans l'enfant et continuer dans le processus parent. J'ai fait quelque chose comme ça en C il y a des années et ça a marché pour moi. Mais c'est moche et susceptible de gâcher quelque chose. Si vous essayez ceci (probablement une mauvaise idée), appelez _Exit() dans l'enfant pour éviter de vider les tampons. Regards, –
Si compilé au code natif, vous pouvez essayer d'utiliser des fonctions standard qui impriment la pile, par ex. libunwind ou backtrace de glibc. Notez que les résultats peuvent ne pas être très jolis mais généralement suffisants pour identifier le problème. – ygrek