Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I get a complete, untrucated stack trace in OCaml after a stack overflow?

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?

like image 258
Clément Avatar asked Feb 04 '23 17:02

Clément


1 Answers

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.)

like image 90
Jeffrey Scofield Avatar answered Apr 30 '23 10:04

Jeffrey Scofield