Глава 15 Система выполнения (ocamlrun)
Команда ocamlrun выполняет файлы байткода, созданные на этапе компоновки командой ocamlc.
1 Обзор
Команда ocamlrun состоит из трех основных частей: интерпретатор байткода, который фактически выполняет файлы байткода; менеджер памяти и сборщик мусора; и набор функций C, которые реализуют базовые операции, такие как ввод/вывод.
Использование ocamlrun:
ocamlrun options bytecode-executable arg1 ... argn
Первый не-опциональный аргумент считается именем файла, содержащего исполняемый байткод. (Этот файл ищется в пути к исполняемым файлам, а также в текущей директории.) Остальные аргументы передаются программе OCaml в массиве строк Sys.argv. Элемент 0 этого массива — имя исполняемого файла байткода; элементы от 1 до n — оставшиеся аргументы arg1 до argn.
Как упоминалось в главе 13, исполняемые файлы байткода, созданные командой ocamlc, являются самозапускаемыми и способны автоматически запускать команду ocamlrun на самих себе. То есть, если a.out — исполняемый файл байткода,
a.out arg1 ... argn
работает точно так же, как
ocamlrun a.out arg1 ... argn
Обратите внимание, что передать опции ocamlrun при непосредственном вызове a.out невозможно.
Windows: Под некоторыми версиями Windows, исполняемые файлы байткода являются самозапускаемыми только если их имя заканчивается на .exe. Рекомендуется всегда давать исполняемым файлам байткода имена, оканчивающиеся на .exe, например, компилировать с ocamlc -o myprog.exe ... вместо ocamlc -o myprog ....
2 Опции
Следующие опции командной строки распознаются командой ocamlrun.
- -b
- При аварийном завершении программы из-за необработанного исключения, выводится подробный «стек вызовов», показывающий, где было вызвано исключение и какие функции были активны в этот момент. Стек вызовов выводится только если исполняемый файл байткода содержит отладочную информацию, т.е. был скомпилирован и скомпонован с опцией -g к ocamlc. Это эквивалентно установке флага b в переменной среды OCAMLRUNPARAM (см. ниже).
- -config
- Выводит номер версии ocamlrun и подробный обзор его конфигурации, затем завершается.
- -I dir
- Ищет динамически загружаемые библиотеки в директории dir дополнительно к стандартному пути поиска (см. раздел 15.3).
- -m
- Выводит магическое число исполняемого файла байткода в качестве аргумента и завершается.
- -M
- Выводит магическое число, ожидаемое для исполняемых файлов байткода этой версией системы выполнения, и завершается.
- -p
- Выводит имена примитивов, известных этой версии ocamlrun, и завершается.
- -t
- Увеличивает уровень отслеживания для отладочной системы выполнения (игнорируется в противном случае).
- -v
- Инструктирует менеджер памяти выводить сообщения о прогрессе в стандартный поток ошибок. Это эквивалентно установке v=61 в переменной среды OCAMLRUNPARAM (см. ниже).
- -version
- Выводит строку версии и завершается.
- -vnum
- Выводит короткую версию номера и завершается.
Также проверяются следующие переменные окружения:
- CAML_LD_LIBRARY_PATH
- Дополнительные каталоги для поиска динамически загружаемых библиотек (см. раздел 15.3).
- OCAMLLIB
- Каталог, содержащий стандартную библиотеку OCaml. (Если OCAMLLIB не задан, будет использован CAMLLIB). Используется для поиска файла конфигурации ld.conf для динамической загрузки (см. раздел 15.3). Если не задан, используется каталог библиотеки, указанный при компиляции OCaml.
- OCAMLRUNPARAM
- Устанавливает параметры системного выполнения и параметры сбора мусора. (Если OCAMLRUNPARAM не задан, используется CAMLRUNPARAM). Эта переменная должна быть последовательностью параметров, разделенных запятыми. Для удобства, запятые в начале переменной игнорируются, а несколько запятых интерпретируются как одна. Параметр спецификации — это буквенный параметр, за которым следует знак =, десятичное число (или шестнадцатеричное число, начинающееся с 0x), и необязательный множитель. Параметры описаны ниже; параметры a, i, l, m, M, n, o, O, s, v, w соответствуют полям записи control, документированным в Модуле Gc.
- b
- (backtrace) Включить вывод стека вызовов при аварийном завершении программы из-за необработанного исключения. Можно указать необязательный аргумент: b=0 отключает вывод стека вызовов; b=1 эквивалентно b и включает вывод стека вызовов; b=2 включает вывод стека вызовов и принудительно загружает отладочную информацию в системное время запуска программы, вместо времени вывода стека вызовов. b=2 может быть использовано, если система не может загрузить отладочную информацию в момент вывода стека вызовов, например, если нет доступных дескрипторов файлов.
- c
- (cleanup_on_exit) Завершение работы системного выполнения с корректной обработкой выхода (см. caml_shutdown в разделе 22.7.5). Параметр также включает пулинг (как в caml_startup_pooled). Этот режим может быть использован для обнаружения утечек с помощью стороннего отладчика памяти.
- e
- (runtime_events_log_wsize) Размер колец буферов событий системного выполнения в логарифмах двоек в словах. По умолчанию 16, давая 64k слов или 512kb буферов на 64-битных системах.
- l
- (stack_limit) Предел размера стека (в словах). Это актуально только для интерпретируемого системного выполнения, так как системное выполнение нативном коде использует стек операционной системы.
- m
- (custom_minor_ratio) Ограничение на плавающую память для памяти вне кучи, удерживаемой пользовательскими значениями в малом куче. Минимальный сбор мусора запускается, когда эта память удерживается пользовательскими значениями, находящимися в малом куче. Выражается в процентах от размера малого кучи. По умолчанию: 100. Примечание: это применяется только к значениям, выделенным с помощью caml_alloc_custom_mem.
- M
- (custom_major_ratio) Целевая пропорция плавающего мусора к размеру основной кучи для памяти вне кучи, удерживаемой пользовательскими значениями (например, bigarrays), находящимися в основной куче. Скорость сбора мусора настраивается для использования этой памяти для мертвых значений, которые еще не собраны. Выражается в процентах от размера основной кучи. По умолчанию: 44. Примечание: это применяется только к значениям, выделенным с помощью caml_alloc_custom_mem.
- n
- (custom_minor_max_size) Максимальный объем памяти вне кучи для каждого пользовательского значения, выделенного в малом куче. Когда пользовательское значение выделяется в малом куче и занимает больше этого числа байт, только это значение учитывается при custom_minor_ratio, а остальное — непосредственно по custom_major_ratio. По умолчанию: 8192 байта. Примечание: это применяется только к значениям, выделенным с помощью caml_alloc_custom_mem.
- o
- (space_overhead) Параметр скорости основного сбора мусора. Подробности см. в документации модуля Gc.
- p
- (parser trace) Включение поддержки отладки для парсеров, сгенерированных ocamlyacc. При включении этого параметра, детерминированный автомат, выполняющий парсеры, выводит трассировку своих действий. Этот параметр не принимает аргументов.
- R
- (randomize) Включение случайной генерации всех хеш-таблиц по умолчанию (см. Модуль Hashtbl). Этот параметр не принимает аргументов.
- s
- (minor_heap_size) Размер малой кучи. (в словах)
- t
- Установить уровень трассировки для отладочного системного выполнения (игнорируется стандартным системным выполнением).
- v
- (verbose) Сообщения от системы сбора мусора, которые должны быть выведены в stderr. Это сумма значений, выбранных из следующего:
- 1 (= 0x001)
- Начало и конец цикла основного сбора мусора.
- 2 (= 0x002)
- Минимальный сбор и основные сегменты сбора мусора.
- 4 (= 0x004)
- Рост и уменьшение кучи.
- 8 (= 0x008)
- Изменение размеров стеков и таблиц менеджера памяти.
- 16 (= 0x010)
- Уплотнение кучи.
- 32 (= 0x020)
- Изменение параметров системы сбора мусора.
- 64 (= 0x040)
- Вычисление размера сегмента основного сбора мусора.
- 128 (= 0x080)
- Вызов функций финализации
- 256 (= 0x100)
- Сообщения о запуске (загрузка исполняемого файла байткода, разрешение общих библиотек).
- 512 (= 0x200)
- Вычисление условия срабатывания уплотнения.
- 1024 (= 0x400)
- Вывод статистики системы сбора мусора при выходе программы.
- 2048 (= 0x800)
- Сообщения системы отладки системы сбора мусора.
- 4096 (= 0x1000)
- Изменения в резервировании адресного пространства.
- V
- (verify_heap) Проверяет целостность кучи сразу после завершения цикла основного сбора мусора.
- W
- Выводит предупреждения системного выполнения в stderr (такие как открытый канал файла, который умирает, не закрывшись, несохраненные данные и т. д.)
Если буква параметра не распознана, весь параметр игнорируется; если знак равенства или число отсутствуют, значение принимается как 1; если множитель не распознан, он игнорируется.
Например, на 32-битной машине под bash команда
export OCAMLRUNPARAM='b,s=256k,v=0x015'
сообщает последующему ocamlrun выводить трассировки стека для необработанных исключений, устанавливать начальный размер малой кучи в 1 мегабайт и выводить сообщение в начале каждого цикла основного сбора мусора, когда размер кучи изменяется, и когда запускается уплотнение.
- CAMLRUNPARAM
- Если OCAMLRUNPARAM не найден в среде, используется CAMLRUNPARAM. Если и CAMLRUNPARAM не найден, используются значения по умолчанию.
- PATH
- Список каталогов, которые просматриваются для поиска исполняемого файла байткода.
3 Динамическая загрузка общих библиотек
На платформах, поддерживающих динамическую загрузку, ocamlrun может динамически связываться с общими библиотеками C (DLL), предоставляя дополнительные C-примитивы помимо тех, которые предоставляет стандартная система времени выполнения. Имена этих библиотек предоставляются во время линковки, как описано в разделе 22.1.4), и записываются в исполняемый файл байткода; ocamlrun затем находит эти библиотеки и разрешает ссылки на их примитивы при запуске исполняемого файла байткода.
Команда ocamlrun ищет общие библиотеки в следующих каталогах в указанном порядке:
- Каталоги, указанные в командной строке ocamlrun с параметром -I.
- Каталоги, указанные в переменной среды CAML_LD_LIBRARY_PATH.
- Каталоги, указанные во время линковки с помощью параметра -dllpath для ocamlc. (Эти каталоги записываются в исполняемый файл байткода.)
- Каталоги, указанные в файле ld.conf. Этот файл находится в каталоге стандартной библиотеки OCaml и содержит имена каталогов (по одному на строку), которые необходимо искать. Как правило, он содержит только одну строку, указывающую подкаталог stublibs каталога стандартной библиотеки OCaml. Пользователи могут добавить туда имена других каталогов, содержащих часто используемые общие библиотеки; однако, для согласованности установки, мы рекомендуем устанавливать общие библиотеки непосредственно в системный каталог stublibs, а не добавлять строки в файл ld.conf.
- Стандартные каталоги, которые ищет системный динамический загрузчик. В Unix эти каталоги, как правило, включают /lib и /usr/lib, а также каталоги, перечисленные в файле /etc/ld.so.conf и переменной среды LD_LIBRARY_PATH. В Windows эти каталоги включают системные каталоги Windows, а также каталоги, перечисленные в переменной среды PATH.
4 Распространенные ошибки
В этом разделе описаны и объяснены наиболее часто встречающиеся сообщения об ошибках.
- filename: no such file or directory
- Если filename — имя исполняемого файла байткода, это означает, что файла не существует или что интерпретатор байткода ocamlrun не смог запуститься. Второй вариант указывает на то, что OCaml не был правильно установлен на вашей системе.
- Cannot exec ocamlrun
- (При запуске исполняемого файла байткода.) Интерпретатор ocamlrun не был найден в пути к исполняемым файлам. Проверьте, правильно ли установлен OCaml на вашей системе.
- Cannot find the bytecode file
- Файл, который пытается выполнить ocamlrun (например, файл, указанный в качестве первого не-опционального аргумента ocamlrun), либо не существует, либо не является корректным исполняемым файлом байткода.
- Truncated bytecode file
- Файл, который ocamlrun пытается выполнить, не является корректным исполняемым файлом байткода. Вероятно, он был усечен или поврежден после создания. Удалите и перестройте его.
- Uncaught exception
- Выполняемая программа содержит «случайную» исключительную ситуацию. То есть, в какой-то момент она генерирует исключение, которое никогда не перехватывается. Это приводит к немедленному завершению программы. Название исключения печатается вместе с его строковым, байтовым и целочисленным аргументами (аргументы более сложных типов не отображаются корректно). Чтобы найти контекст неперехваченного исключения, скомпилируйте программу с параметром -g и либо запустите её снова с отладчиком ocamldebug (см. главу 20), либо запустите её с ocamlrun -b или с установленной переменной среды OCAMLRUNPARAM в значение b=1.
- Out of memory
- Выполняемой программе требуется больше памяти, чем доступно. Либо программа создает чрезмерно большие структуры данных; либо программа содержит слишком много вложенных вызовов функций, и происходит переполнение стека. В некоторых случаях сообщение «недостаточно памяти» указывает на ошибку в вашей программе: нетерминальная рекурсивная функция, выделение чрезмерно большого массива, строки или последовательности байтов, попытки создания бесконечного списка или другой структуры данных, …
Чтобы помочь в диагностике этой ошибки, запустите свою программу с параметром -v для ocamlrun, или с переменной среды OCAMLRUNPARAM, установленной в значение v=63. Если отображается много сообщений «Growing stack…», это, вероятно, бесконечная рекурсивная функция. Если отображается много сообщений «Growing heap…», с медленно увеличивающимся размером кучи, это, вероятно, попытка построения структуры данных с слишком большим числом (бесконечным числом?) ячеек. Если отображается мало сообщений «Growing heap…», но с огромным увеличением размера кучи, это, вероятно, попытка создать чрезмерно большой массив, строку или последовательность байтов.
© 1995-2024 INRIA.
https://ocaml.org/manual/5.2/runtime.html