Ошибка сохранения изображения 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").

Другие вопросы по тегам