Как напечатать вызовы функций и возврат на верхний уровень?
Я пытаюсь получить обратный след вызовов функций. Интересно, кто-нибудь знает, как сделать это на высшем уровне.
1 ответ
#trace
директива полезна для отслеживания функций, например,
# let rec f x = if x > 0 then f (x - 1) else "done";;
val f : int -> string = <fun>
# #trace f;;
f is now traced.
# f 12;;
f <-- 12
f <-- 11
f <-- 10
...
Чтобы отследить несколько функций, используйте #trace для всех них, например,
#trace f;;
#trace g;;
Не забывайте, что после того, как вы переопределили функцию, вам нужно вызвать #trace
опять же, так как с точки зрения верхнего уровня это новая функция, хотя она имеет то же имя.
Для отслеживания функции f
использование #untrace f
, чтобы отследить все функции, которые в данный момент отслеживаются #untrace_all
Также вы можете найти полезное Printexc.get_callstack
функция, что, если вы включили запись трассировки с Printexc.record_bactrace true
, покажет вам текущий стек вызовов.