8

Tôi đang cố gắng để có được một stacktrace với Printexc.get_backtrace, nhưng tôi nhận được một lỗi:Khi nào -g nên được sử dụng để in dấu vết ngăn xếp trong OCaml?

(Program not linked with -g, cannot print stack backtrace)

Tôi đang soạn thảo như thế này:

ocamlfind ocamlc -g -o foo ... $(FOO_OBJS)

FOO_OBJS được biên soạn với chỉ: ocamlc -c $OBJ

Có vấn đề gì? Mỗi .cmo có được biên dịch với -g không?

Nếu ngoại lệ xảy ra trong một đối tượng được biên dịch mà không có -g tôi sẽ nhận được một ngăn xếp từng phần hay không có ngăn xếp stacktrace?

Trả lời

9

What's wrong? Should every .cmo be compiled with -g?

Có, bạn phải thêm tùy chọn -g để lập và liên kết. Bạn cũng có thể sử dụng ocamldebug để duyệt qua chương trình với tùy chọn này. Ngoài ra biến môi trường, OCAMLRUNPARAM phải được đặt thành b.

If exception occurs in an object compiled without -g will I get a partial stacktrace, or no stacktrace at all?

Bạn đặt cược! Tôi nhớ lại một vài lần rằng tôi đã quên tùy chọn -g và dấu vết ngược lại chỉ là thư viện chuẩn.

+4

Bằng cách này, tất cả các thư viện (cma và cmxa) phải được biên dịch bằng -g, nếu không thì người dùng kém sẽ nhận được backtraces ngăn xếp không đầy đủ. –

+0

Bạn may mắn nhận được một phần backtrace, đôi khi trộn mô-đun có và không có -g làm cho backtraces hoàn toàn sai - xem PR # 5074 – ygrek

+1

Có một biến môi trường 'OCAMLRUNPARAM = b' bạn có thể thiết lập, làm thế nào là có liên quan? – Ptival

Các vấn đề liên quan