首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在堆栈溢出之后,如何在OCaml中获得完整的、非协商的堆栈跟踪?

在堆栈溢出之后,如何在OCaml中获得完整的、非协商的堆栈跟踪?
EN

Stack Overflow用户
提问于 2017-04-05 04:29:32
回答 3查看 721关注 0票数 4

堆栈溢出的OCaml堆栈跟踪被截断;例如,下面的程序生成如下所示的堆栈跟踪:

代码语言:javascript
复制
let rec f0 () = 1 + f1 ()
    and f1 () = 1 + f2 ()
    and f2 () = 1 + f3 ()
    and f3 () = 1 + f4 ()
    and f4 () = 1 + f5 ()
    and f5 () = 1 + f5 ()

let _ =
  Printexc.record_backtrace true;
  f0 ()
代码语言:javascript
复制
Fatal error: exception Stack overflow
Raised by primitive operation at file "stackoverflow.ml", line 6, characters 20-25
Called from file "stackoverflow.ml", line 6, characters 20-25
…
Called from file "stackoverflow.ml", line 6, characters 20-25

当错误不是堆栈溢出时,与堆栈跟踪形成对比(将最终的f5 ()更改为failwith "Oops" )

代码语言:javascript
复制
Fatal error: exception Failure("Oops")
Raised at file "pervasives.ml", line 30, characters 22-33
Called from file "stackoverflow.ml", line 6, characters 20-35
Called from file "stackoverflow.ml", line 5, characters 20-25
Called from file "stackoverflow.ml", line 4, characters 20-25
Called from file "stackoverflow.ml", line 3, characters 20-25
Called from file "stackoverflow.ml", line 2, characters 20-25
Called from file "stackoverflow.ml", line 1, characters 20-25
Called from file "stackoverflow.ml", line 10, characters 2-7

如何防止OCaml截断堆栈跟踪?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-04-14 23:05:29

您可以使用ocamldebug获取堆栈跟踪:

代码语言:javascript
复制
ocamlc stackoverflow.ml -o stackoverflow
ocamldebug stackoverflow

然后在ocamldebug中:

代码语言:javascript
复制
(ocd) run
 [...] 
 Uncaught exception: Stack_overflow
(ocd) backstep
(ocd) bt

您可能希望将调试标志添加到ocamlc (-g)中,以便在调试器中执行额外的操作。

票数 2
EN

Stack Overflow用户

发布于 2017-04-05 05:02:56

当我复制你的结果时,我得到1024行回溯,这是一个可疑的数字。

实际上,我看到这个库在byterun/caml/ backtrace _prim.h中强制设置了一个硬编码的最大回溯大小为1024:

代码语言:javascript
复制
#define BACKTRACE_BUFFER_SIZE 1024

如果您想要更大的回溯,您可能必须构建一个新的标准库。

为了说明它的价值,我在ocamlc上做了一些测试,当溢出发生时,我看到了大约262,000个活动堆栈帧(具有默认的堆栈大小)。

(用正确的OCaml 4.04文件名编辑)

票数 4
EN

Stack Overflow用户

发布于 2017-04-05 16:14:07

您可以限制堆栈,这样它就不会溢出回溯缓冲区,例如(用字节码测试)

代码语言:javascript
复制
$ env OCAMLRUNPARAM=b,l=1000 ./test
[...]
Called from file "test.ml", line 6, characters 20-25
Called from file "test.ml", line 6, characters 20-25
Called from file "test.ml", line 5, characters 20-25
Called from file "test.ml", line 4, characters 20-25
Called from file "test.ml", line 3, characters 20-25
Called from file "test.ml", line 2, characters 20-25
Called from file "test.ml", line 1, characters 20-25
Called from file "test.ml", line 10, characters 2-7
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43221830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档