Как получить трассировку стека в OCaml? - PullRequest
25 голосов
/ 28 сентября 2008

Язык Objective Caml будет генерировать трассировки стека только в том случае, если вы правильно их попросите - каковы требования к байт-коду и нативному коду?

Ответы [ 4 ]

36 голосов
/ 28 сентября 2008

Компилировать с -g и установить переменную окружения OCAMLRUNPARAM = b

9 голосов
/ 01 февраля 2010

Некоторые функции Printexc позволяют делать это программно.

3 голосов
/ 23 июня 2013

Поскольку похоже, что вы можете получать трассировки только для исключений в Unix, вы можете разветвляться и генерировать исключение во втором процессе. Таким образом, основной процесс может продолжаться:

export OCAMLRUNPARAM=b
# compile with -g

flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
0 голосов
/ 30 июля 2017

Если вы используете Ocamlbuild вместо прямого запуска компилятора, вы можете использовать тег debug. Из руководства :

С помощью OCamlbuild вы можете просто добавить отладочный тег к целям вашей программы, и он определит, когда вставить флаг -g или нет.

Например, если вы создаете файл foo.ml с пакетом bar, тогда ваш _tags файл будет иметь строку:

<foo.ml>: package(bar), debug

Это вставит соответствующие флаги -g при создании байт-кода / собственных файлов. Однако вам все равно необходимо установить переменную среды, используя export OCAMLRUNPARAM=b, как указано в других ответах.

...