Трассировка внутреннего пакета sbcl вызывает переполнение стека управления
Для отладки внутренних компонентов sbcl я попытался отследить внутренние пакеты sbcl.
Например я пытался
(trace "SB-IMPL")
Это вызывает переполнение стека управления. Я попытался изменить опцию запуска размера стека управления при запуске SBCL, но без изменений.
Кроме того, я также попытался изменить функцию, используя: (только фрагмент)
(setf (symbol-function s)
#'(lambda (&rest args)
;do something
;invoke original function
;do something more))
под do-all-символы только для символов, принадлежащих указанным пакетам.
Тем не менее я получаю ошибку переполнения. Приведенный выше код показывает исчерпанную ошибку стека связывания. Возможно, кто-то может объяснить, как контролировать размер стека привязки?
В качестве альтернативы, если кто-то может указать на то, как изменить определения внутренних функций SBCL во время их компиляции, может быть также замечательно? Я мог бы использовать этот трюк для перекомпиляции SBCL из исходного кода в этом случае.
1 ответ
Я думаю, что проблема здесь в том, что вы отслеживаете функции (в частности, SB-IMPL::FLUSH-OUTPUT-BUFFER), которые используются при самой трассировке. Что-то (REPL) вызывает FLUSH-OUTPUT-BUFFER, который отслеживается, поэтому trace пытается вывести некоторые данные, которые вызывают FLUSH-OUTPUT-BUFFER, которые отслеживаются, поэтому trace пытается вывести некоторые данные, которые вызывают FLUSH-OUTPUT- БУФЕР, который прослеживается....
В зависимости от того, что вы пытаетесь отследить, вы можете выполнить свою задачу, отслеживая эти функции специально вместо всех SB-IMPL.
Если вам действительно нужно отследить что-то слишком низкое для использования трассировки, вы можете скомпилировать с включенной функцией SB-SHOW (взгляните на base-target-features.lisp-expr и src/code/show.lisp), Это может распечатать много информации трассировки низкого уровня.