На OS X с SLIME нижний lisp останавливался при загрузке сторонних библиотек
Я использую Quicklisp для загрузки систем и отлаживаю свой код с помощью Slime. Quicklisp успешно загружает многие системы, кроме cl-postgresql.
При оценке (ql:quickload "clsql-postgresql")
в слизи нижний лисп выходит.
Отпечатки слизи
Lisp connection closed unexpectedly: connection broken by remote peer
в минибуфере и
Process inferior-lisp trace/BPT trap: 5
в буфере * inferior-lisp *.
Но вычисление (ql:quickload "clsql-postgresql") в SBCL без Slime не вызовет никакой ошибки.
Я искал "Trap /BPT trap: 5" с Google. Похоже, сообщение указывает на проблемы с загрузкой динамических библиотек. Я предполагаю, что ошибка вызвана неправильными путями поиска, установленными Slime. Согласно http://clsql.b9.com/manual/appendix.html, я проверил CLSQL:*FOREIGN-LIBRARY-SEARCH-PATHS*
в голой среде SBCL и Slime, но они оба были nil
,
Почему clsql-postgresql не загружается при использовании Slime?
Среда:
- SBCL 1.1.8
- OS X 10.8.4
- последний быстрый список
- последняя слизь
- Emacs 24,3
(извините за мой английский, я не являюсь носителем языка)
1 ответ
Я проверил диагностический отчет пользователя. И я нашел следующие строки:
Thread 7 Crashed:
0 com.apple.CoreFoundation 0x00007fff8fab52d5 __CFInitialize + 69
1 dyld 0x00007fff6f56d256
Так что я погуглил "CoreFoundation". Он сказал, что CoreFoundation должен быть загружен основным потоком, в противном случае он будет сигнализировать SIGTRAP. Это правило OS X.
Смотрите: Отладка сбоя при открытии библиотеки через dlopen в OSX
В голом SBCL, ql:quickload
напрямую оценивается в основном потоке. Но в SLIME формы оцениваются с помощью отдельного потока, запускаемого SWANK.
Решение состоит в том, чтобы оценить (ql:quickload "clsql-postgresql")
в *inferior-lisp*
, вместо *slime-repl*
, когда libpg - первая сторонняя библиотека, зависящая от загружаемого CoreFoundation.