在OCaml中打印当前调用堆栈

在OCaml中打印当前调用堆栈,ocaml,Ocaml,OCaml中有没有一种方法可以通过编程方式获取当前调用堆栈?这里,我不是指在调试器内部,而是作为程序内部的函数调用,该程序将打印当前调用堆栈。我认为这不应该超出字节码解释器的能力,特别是在调试符号可用的情况下。对于本机代码,可以使用glibc,尽管它可能无法正确打印所有堆栈帧。不幸的是,从代码内部获取回溯的唯一方法是在引发异常时,然后可以使用Printexc.get\u backtrace()。它不会告诉你函数的名称,只会告诉你堆栈中的函数在代码中的位置,而且只有在OCaml能够恢复它们的情况下

OCaml中有没有一种方法可以通过编程方式获取当前调用堆栈?这里,我不是指在调试器内部,而是作为程序内部的函数调用,该程序将打印当前调用堆栈。我认为这不应该超出字节码解释器的能力,特别是在调试符号可用的情况下。

对于本机代码,可以使用glibc,尽管它可能无法正确打印所有堆栈帧。

不幸的是,从代码内部获取回溯的唯一方法是在引发异常时,然后可以使用Printexc.get\u backtrace()。它不会告诉你函数的名称,只会告诉你堆栈中的函数在代码中的位置,而且只有在OCaml能够恢复它们的情况下…

你也可以使用ocamldebug,你可以用它启动你的代码,用字节码编译。在这种环境下,Printexc.get_backtrace()要完整得多。

我来问这个问题也是为了寻找同样的东西,这是我的解决方案

Printexc.get_callstack 5>Printexc.raw_backtrace_to_string


(这实际上是熟悉新代码库的一个很好的方法)

您是否尝试过
Printexc.get_backtrace
(如中所述)?@PascalCuoq:这似乎不相关。@Clément四个答案中有三个提到的函数不相关,您的意思是?是的。该问题询问了一种获取“将打印当前调用堆栈的程序内部的函数调用”的方法。您建议的函数“列出最近引发异常的程序位置以及通过函数调用传播异常的位置”。@Clément如果您不使用与您交谈的人的姓名,他们将不会知道您发表了评论。