Un meilleur débogage du crash d'Emacs?

9

Bien qu'Emacs (24.3.93.1) fonctionne correctement s'il est lancé à partir du Finder, si la version du terminal est lancée:

/Applications/Emacs.app/Contents/MacOS/Emacs -nw

Emacs se bloque avec:

Fatal error 11: Segmentation fault[1] 51512 abort /Applications/Emacs.app/Contents/MacOS/Emacs -nw.

Il semble que le problème soit causé par une seule ligne dans init.el,

(set-face-attribute 'default nil :font "Menlo-16")

Si cette ligne est mise en commentaire, la version terminale d'Emacs démarrera également très bien.

Identifier la cause de l'accident m'a pris plusieurs heures (diminuant de moitié mon init.el).

Je suis conscient que dans tous les cas, Emacs héritera de la police et de la taille de police spécifiées dans l'application terminale (fondamentalement, cette ligne n'a pas de sens dans le cli.)

  1. D'une manière générale, existe-t-il une meilleure façon de déboguer un Emacs qui plante? Peut-être en utilisant une sorte de débogueur cli qui imprimerait un message plus descriptif?
  2. Pourquoi cette ligne plante-t-elle Emacs via cli, mais pas si elle est lancée depuis le Finder?
gsl
la source
est-ce vraiment un lancement depuis le cli? ou lancer la version du terminal à l'origine du problème? Essayez de mettre des erreurs autour de l'attribut set-face-attribute? (condition-case err (set-face-attribute ...) (error (message "Whoops!")))
nic ferrier
3
Déposer un rapport de bogue. Emacs ne devrait jamais planter à cause du code lisp. Mais cela peut être un problème avec la version spécifique que vous utilisez, est-ce la version officielle?
Malabarba
@ nic-ferrier: J'ai maintenant une seule ligne dans init.el, (condition-case err (set-face-attribute 'default nil :font "Menlo-16") (error (message "Whoops!")))j'ai toujours le même plantage avec le même message d'erreur. Aucun message supplémentaire provenant d'Elisp.
gsl
@ Malabarba: Je l' ai essayé avec GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2013-03-13 on bob.porkrind.orgde emacsformacosx.com et Emacs ne tombe pas en panne. Il doit donc s'agir d'un bug dans les versions ultérieures. Je déposerai un rapport de bogue.
gsl
1
Comme indiqué @Malabarba: Déposer un rapport de bogue (immédiatement): M-x report-emacs-bug. Les développeurs d'Emacs vous guideront ensuite dans ce que vous pouvez faire pour aider à déboguer le problème.
Drew

Réponses:

6

Pour vous aider à le suivre la prochaine fois

Cela m'est arrivé avant. Il y avait une situation où string-to-intEmacs s'est écrasé, et il m'a fallu des heures pour le localiser également.
Désolé, je ne peux pas fournir une meilleure réponse, mais les plantages Emacs se produisent profondément dans le code C, et il n'y a pas d'outils intégrés disponibles pour rechercher de tels problèmes.

Je suppose que le débogage avec gdbest possible, mais son efficacité dépendra de votre compétence avec gdb.

Ce que vous devez vraiment faire, c'est

Déposer un rapport de bug

Le code Elisp pur (non compilé par octets) n'est jamais censé planter Emacs. Cela pourrait provoquer un blocage (en raison d'une boucle infinie) et entraîner un manque de mémoire d'Emacs. Mais, au-delà de cela, tout plantage est un bug .

M-x report-emacs-bug

Le simple fait de fournir cet exemple de fonctionnement minimal que vous avez proposé, accompagné d'une description de votre build et de votre système, devrait être une aide suffisante pour les développeurs aimables.

Malabarba
la source
2
Utiliser gdb serait le seul moyen. Nous pourrions ajouter des éléments à Emacs pour encapsuler chaque appel C dans quelque chose qui s'auto-intercepterait mais qui serait tout le temps en surcharge. Emacs n'est pas censé planter, si c'est le cas, nous devons gérer spécifiquement ce bogue pour qu'il ne le fasse plus. Alors oui, s'il est cassé, signalez un bug. Utilisez gdb par tous les moyens pour savoir absolument où se trouve le bogue.
nic ferrier
4

Comme référence pour déboguer avec gdb, vous voudrez utiliser src / temacs à partir de l'arbre de construction. C'est Emacs sans l'elisp pré-jeté qui confond le débogueur.

gdb --args src/temacs -nw
stsquad
la source
1
Merci, excellents conseils (et pas trop faciles à trouver aussi). Merci.
gsl