Трассировка внутреннего пакета 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), Это может распечатать много информации трассировки низкого уровня.

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