Трассировка внутреннего пакета sbcl вызывает переполнение стека управления - PullRequest
0 голосов
/ 01 ноября 2011

Для отладки внутренних компонентов sbcl я попытался отследить внутренние пакеты sbcl.

Например, я пытался

(trace "SB-IMPL")

Это вызывает переполнение стека управления. Я попытался изменить размер стека управления опция запуска при запуске SBCL, но без изменений.

Кроме того, я также попытался изменить функцию, используя: (только фрагмент)

(setf (symbol-function s)
      #'(lambda (&rest args)
          ;do something
          ;invoke original function
          ;do something more))

в символах do-all-only только для символов, принадлежащих указанным пакетам.

Тем не менее я получаю ошибку переполнения. Приведенный выше код показывает, что стек привязки исчерпан ошибка. Возможно, кто-то может объяснить, как контролировать размер стека связывания?

В качестве альтернативы, если кто-то может указать, как изменить внутренний Определения функций SBCL во время их компиляции также могут быть хорошими? Я мог бы использовать этот трюк для перекомпиляции SBCL из источника в этом случае.

1 Ответ

3 голосов
/ 01 ноября 2011

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

...