2011-11-01 5 views
0

Afin de déboguer les composants internes de sbcl, j'ai essayé de suivre les paquets internes de sbcl.Le traçage du paquet sbcl interne provoque un débordement de la pile de contrôle

Par exemple, j'essayé

(trace "SB-IMPL") 

Cela provoque un débordement de pile de contrôle. J'ai essayé de changer l'option de démarrage de la taille de la pile de contrôle lors du démarrage de SBCL, mais pas de changement.

Sinon, j'ai aussi essayé de modifier la fonction à l'aide: (uniquement snippet)

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

sous-do all-symboles seulement pour des symboles appartenant à des paquets spécifiés.

Encore j'obtiens l'erreur de débordement. Le code ci-dessus montre l'erreur de pile de liaison épuisée . Probablement quelqu'un peut expliquer comment contrôler la taille de la pile de liaison? Sinon, si quelqu'un peut indiquer comment modifier les définitions de fonctions SBCL internes pendant qu'elles sont compilées, cela peut aussi être génial? Je pourrais utiliser cette astuce pour recompiler SBCL de la source dans ce cas.

Répondre

3

Je pense que le problème ici est que vous tracez des fonctions (probablement SB-IMPL :: FLUSH-OUTPUT-BUFFER en particulier) qui sont utilisées pour le traçage lui-même. Quelque chose (le REPL) appelle FLUSH-OUTPUT-BUFFER, qui est tracée, donc trace essaye de sortir quelque chose, qui appelle FLUSH-OUTPUT-BUFFER, qui est tracée, ainsi trace essaye de sortir quelque chose, qui appelle FLUSH-OUTPUT- BUFFER, qui est tracée ....

En fonction de ce que vous essayez de tracer, vous pourrez peut-être accomplir votre tâche en traçant ces fonctions spécifiquement au lieu de tout SB-IMPL.

Si vous devez vraiment tracer quelque chose de trop bas niveau pour utiliser trace, vous pouvez vouloir compiler avec la fonction SB-SHOW activée (jetez un oeil dans base-target-features.lisp-expr et src/code/show.lisp). Cela peut imprimer beaucoup d'informations de trace de bas niveau.

+0

Merci Samuel. Oui, vous avez raison concernant la dépendance circulaire. La même chose m'a été signalée par sbcl-devel, bien que vous l'ayez expliqué avec des fonctions réelles. Oui, j'active la fonction show et j'imprime des informations utiles sur le fonctionnement interne. Mais je voulais aller tout le porc et quoi de mieux que de tracer un paquet entier. Je peux maintenant faire un peu de creusage et probablement à travers le code activer/désactiver la trace sur les fonctions de paquet interne valides. Merci encore. –

Questions connexes