OCaml stack traces for stack overflows are truncated; for example, the following program produces the stack trace shown below:
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 ()
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
Contrast with the stack trace when the error is not a stack overflow (change the final f5 ()
into failwith "Oops"
:
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
How can I prevent OCaml from truncating stack traces?
When I reproduce your results I get 1024 lines of backtrace, which is a suspicious number.
In fact, I see that the library imposes a hard-coded maximum backtrace size of 1024 in byterun/caml/backtrace_prim.h:
#define BACKTRACE_BUFFER_SIZE 1024
You might have to build a new standard library if you want larger backtraces.
For what it's worth I did a little test with ocamlc and I see around 262,000 active stack frames when the overflow occurs (with default stack size).
(Edited with correct filename for OCaml 4.04.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With