Interrompre l'évaluation et observer la pile actuelle dans le débogueur emacs-lisp?

17

Si une fonction emacs-lisp, comme un hook de mode majeur, prend plus de temps que prévu à s'exécuter, je voudrais parfois l'interrompre et regarder la pile actuelle. Idéalement, j'aimerais également pouvoir regarder les valeurs des variables, et ainsi de suite, dans le débogueur. Je ne parle pas de code que j'exécute délibérément en mode emacs-lisp, mais plutôt de code qui s'exécute dans le fonctionnement normal d'emacs.

Comment puis-je interrompre l'exécution du code emacs-lisp directement dans emacs? Je ne sais pas d'avance quelle fonction je dois déboguer.

Par exemple, la saisie C-g, même si elle interrompt l'exécution, ne me dit rien non plus sur la fonction interrompue.

Kirill
la source

Réponses:

18

Vous pouvez faire C-gdéclencher le débogueur en l'activant debug-on-quit. Fais juste

M-x toggle-debug-on-quit

Maintenant, chaque fois que vous frappez, C-gvous aurez une trace de ce qui se passait. Cette trace est interactive, vous pouvez donc continuer à parcourir la fonction avec det vous pouvez commencer à sortir avec c. (Essayez, c'est plus facile à voir qu'à lire).

C'est la même trace que vous obtenez en ajoutant à l' (debug)intérieur de votre code. Voici un court article de blog à ce sujet et la page de manuel Elisp correspondante .

Malabarba
la source
(dit doucement hello);) Remarque impressionnante que le débogueur est interactif - je n'ai jamais pensé à vérifier cela :)
Sean Allred
@SeanAllred oui, je l'ai découvert il y a seulement quelques semaines.
Malabarba