Ошибка сохранения изображения SBCL из Emacs Multiple Threads
Я играл с сохранением запущенных образов Common Lisp, чтобы сэкономить время при перезапуске и сделать разработку более эффективной. Однако у меня возникла небольшая проблема, поскольку, когда я запускаю следующую команду в Emacs/SLIME:
(sb-ext:save-lisp-and-die "rest-api-image" :purify t)
Я получаю следующую ошибку. Ясно, что он жалуется на просмотр нескольких потоков. Насколько я вижу, это не те потоки, которые я создал программно. Вместо этого они создаются в Lisp и Emacs. Есть ли обходной путь здесь? Можно ли сохранить изображение?
Cannot save core with multiple threads running.
Interactive thread (of current session):
#<THREAD "main thread" RUNNING {1000550853}>
Other threads:
#<THREAD "Swank Sentinel" #1=waiting on:
#<WAITQUEUE {1004AB8003}>
{1004AB4753}>,
#<THREAD "control-thread" #1#
#<WAITQUEUE {1005BC54D3}>
{1004D87F03}>,
#<THREAD "reader-thread" RUNNING {1004D88063}>,
#<THREAD "swank-indentation-cache-thread" #1#
#<WAITQUEUE {1004D980E3}>
{1004D88183}>,
#<THREAD "auto-flush-thread" RUNNING {10022FFDA3}>,
#<THREAD "repl-thread" RUNNING {1002300003}>
[Condition of type SB-IMPL::SAVE-WITH-MULTIPLE-THREADS-ERROR]
See also:
SBCL Manual, Saving a Core Image [:node]
3 ответа
Поваренная книга покрывает вас: https://lispcookbook.github.io/cl-cookbook/scripting.html
Шаги включают в себя:
(load "my-app.asd")
(ql:quickload :my-app)
(sb-ext:save-lisp-and-die #p"my-app-binary" :toplevel #'my-app:main :executable t)
Итак, это возможная цель Makefile:
build:
sbcl --load my-app.asd \
--eval '(ql:quickload :my-app)' \
--eval "(sb-ext:save-lisp-and-die #p\"my-app\" :toplevel #my-app:main :executable t)"
но делать это с asdf переносимо:
:build-operation "program-op" ;; leave as is
:build-pathname "<binary-name>"
:entry-point "<my-package:main-function>"
а потом
asdf:make :my-package
Создание веб-приложения с его веб-сервером - еще один шаг.
Для разбора аргументов командной строки, поймать C-c
, поставь все на КИ, смотри Кулинарную книгу!
ps: если вам нужно попробовать что-то в простом реплик sbcl, взглянуть на cl-repl или даже sbcli, они лучше, чем rlwrap sbcl
,
Типичный способ сохранить изображение - запустить SBCL из командной строки (а не из emacs для SLIME), загрузить то, что вы хотите представить в образе, и немедленно сохранить изображение. Это гарантирует отсутствие состояния или потоков, установленных SLIME или другими запущенными процессами / потоками при попытке сохранения.
Я обычно пишу короткий Lisp-файл, чтобы сделать это, и окончательная форма имеет вызов save-lisp-and-die
,
Если я правильно помню, у меня была похожая ошибка, и мне все же удалось сохранить изображение. Я использовал пакет tribute-dump-core.
Это поможет вам перейти к буферу
*inferior lisp*
в Emacs и запустив выражение
(trivial-dump-core::sbcl-dump-image-slime "sbcl-slime")
.