Как получить трассировку стека в OCaml?
-
02-07-2019 - |
Вопрос
Язык Objective Caml будет создавать трассировки стека только в том случае, если вы правильно их запросите. Каковы требования как к байт-коду, так и к собственному коду?
Решение
Скомпилируйте с ключом -g и установите переменную среды OCAMLRUNPARAM=b.
Другие советы
Некоторый Распечатать функции позволяют сделать это программно.
Поскольку похоже, что вы можете получить трассировку исключений только в Unix, вы можете разветвить и выдать исключение во втором процессе.Таким образом, основной процесс может продолжаться:
export OCAMLRUNPARAM=b
# compile with -g
flush_all(); let r = Unix.fork() in if r == 0 then raise Exit
Если вы используете Ocamlbuild вместо прямого вызова компилятора, вы можете использовать команду debug
ярлык.Из руководство:
С помощью OCamlbuild вы можете просто добавить тег отладки к целям вашей программы, и он сам определит, вставлять флаг -g или нет.
Например, если вы создаете файл foo.ml
с пакетом bar
тогда твой _tags
файле будет строка:
<foo.ml>: package(bar), debug
Это вставит соответствующий -g
флаги при создании байт-кода/родных файлов.Однако вам все равно необходимо установить переменную среды, используя export OCAMLRUNPARAM=b
как упоминалось в других ответах.