Déboguer un Emacs gelé


48

J'utilise mew pour mon courrier électronique. Je dois utiliser TLS avec mon fournisseur de messagerie pour SMTP. Cependant, lorsque j'essaie d'invoquer cela, Emacs se fige.

J'aimerais profiter de cette occasion pour en apprendre davantage sur les paquets Emacs. Comment pourrais-je procéder pour résoudre ce problème? Existe-t-il une sorte de débogueur intégré, comme dans Common Lisp? Puis-je utiliser la journalisation?


3
Comment "invoquez-vous"? Si vous utilisez une commande Emacs définie dans Lisp, vous pouvez (1) charger le code source définissant la commande, (2) utiliser M-x debug-on-entry THE-COMMAND, puis parcourir le débogueur en utilisant d(ou parfois cen sautant certaines étapes). Laissez le code source ouvert dans un autre cadre afin que vous puissiez suivre ce que fait le débogueur. Signalez ce que vous voyez ici ou, si vous pensez que cela suggère un bogue Emacs, utilisez M-x report-emacs-bug.
Drew

Réponses:


45

Avant de recourir à gdb, si vous utilisez un système d'exploitation Unix-y, vous pouvez essayer d'envoyer SIGUSR2au processus Emacs, comme DEBUGindiqué dans le fichier mentionné dans l'autre réponse.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Cela fera en sorte que Emacs tente de sortir de sa boucle de courant dans le débogueur Lisp.

Ou utilisez ce support sans taper emacs pid manuellement:

$ ps aux | grep -ie emacs | grep -v grep | awk '{print $2}' | xargs kill -SIGUSR2

Sinon, si killallest disponible:

$ killall -USR2 emacs

1
J'ai dû le faire deux fois (enfin, j'aurais pu attendre plus d'une seconde avant de réessayer :-). Quoi qu’il en soit, le problème a été mis en évidence (traitement du verrouillage de la police trop lent pour une longue ligne).
Stéphane Gourichon

font-lock est connu pour suspendre Emacs - si un élément déclencheur se déclenche mais ne déplace pas le point en avant, il se déclenche de nouveau pour toujours.
Lindydancer

wow, c'était incroyable. Je ne sais toujours pas ce qui cause mon problème, mais cette astuce sauve des vies, merci!
Matt

3
Sur mon système, oneliner peut être simplifié en 'killall -USR2 emacs' (à éviter si vous avez plusieurs processus Emacs bien sûr).
YoungFrog

1
Recommander htop ( en.wikipedia.org/wiki/Htop ) pour cela. /rechercher emacset kenvoyer le signal. Activity Monitor sur un Mac peut également le faire (à partir du menu: Afficher | Envoyer un signal au processus).
Lassi

36

Si le gel disparaît lorsque vous frappez C-g, vous pouvez utiliser le débogueur intégré. Tapez M-x toggle-debug-on-quitavant d’envoyer le message, appuyez sur C-gle bouton quand il se fige et examinez le *Backtrace*tampon qui s’affiche .

Si cela C-gn’aide en rien, le gel se produit probablement dans le code C et vous devrez utiliser un débogueur externe tel que gdb. Cliquez sur C-h C-dpour voir le DEBUGfichier qui donne quelques conseils sur la façon de le faire. (Vous pouvez également lire le fichier DEBUG dans l'interface Web du référentiel Emacs .) Cette réponse explique plus en détail comment utiliser gdbEmacs.


Vous pourriez avoir à frapper à C-gplusieurs reprises: C-g C-g C-g.
Dessiné

@Drew J'ai aussi remarqué qu'il était nécessaire de le frapper plusieurs fois. Est-ce que tu sais pourquoi?
Wilfred Hughes

2
Oui. Voir le manuel Emacs, noeudQuitting . Comment j'ai trouvé ça? C-h r i, puis tapez "Cg" et appuyez sur RET.
Dessiné
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.