0

sbcl内部をデバッグするために、sbcl内部パッケージをトレースしてみました。

たとえば、私は試しました

(trace "SB-IMPL")

これにより、コントロールスタックオーバーフローが発生します。SBCLの起動中に制御スタックサイズの起動オプションを変更しようとしましたが、変更されませんでした。

または、次を使用して関数を変更しようとしました:(スニペットのみ)

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

指定されたパッケージに属するシンボルの場合のみ、do-all-symbolsの下にあります。

それでもオーバーフローエラーが発生します。上記のコードは、バインディングスタックの枯渇エラーを示しています。おそらく誰かがバインディングスタックサイズを制御する方法を説明できますか?

あるいは、誰かがコンパイル中に内部SBCL関数定義を変更する方法を指摘できれば、それも素晴らしいことでしょうか?その場合、そのトリックを使用してソースからSBCLを再コンパイルできます。

4

1 に答える 1

3

ここでの問題は、トレース自体で使用される関数 (特に SB-IMPL::FLUSH-OUTPUT-BUFFER) をトレースしていることだと思います。何か (REPL) がトレースされる FLUSH-OUTPUT-BUFFER を呼び出すため、トレースは、トレースされる FLUSH-OUTPUT-BUFFER を呼び出すいくつかのものを出力しようとします。トレースされる BUFFER....

トレースしようとしているものによっては、SB-IMPL のすべてではなく、これらの関数を具体的にトレースすることでタスクを達成できる場合があります。

トレースを使用するにはあまりにも低レベルなものをトレースする必要がある場合は、SB-SHOW 機能を有効にしてコンパイルすることをお勧めします (base-target-features.lisp-expr と src/code/show.lisp を参照してください)。 . これにより、多くの低レベルのトレース情報が出力される可能性があります。

于 2011-11-01T15:56:04.203 に答える