Je débogue pourquoi emacs se bloque lors de l'utilisation d'une fonction à partir d'un package 1 . Le but de ce processus de débogage est d'obtenir des données utiles à soumettre en utilisant M-x report-emacs-bug
.
Pour obtenir de l'aide sur la façon de déboguer les plantages d'emacs, j'ai déjà regardé Emacs Manual - Crashing et Emacs Manual - After a Crash , mais ils n'ont pas aidé.
Le manuel After A Crash fait référence emacs-buffer.gdb
mais je ne sais pas comment l'utiliser. En demandant de l'aide à Google, je suis tombé sur cette question emacs.SE et j'ai recompilé emacs en utilisant les -ggdb3
drapeaux.
Je n'ai aucune expérience préalable de l'utilisation gdb
et j'ai donc tenté quelques tentatives infructueuses d'utilisation du emacs-buffer.gbd
fichier.
Voici ce que j'ai essayé:
gdb -x /path/to/emacs-buffer.gdb
gdb
->file /path/to/emacs-buffer.gdb
gdb
->source /path/to/emacs-buffer.gdb
source /path/to/emacs-buffer.gdb
Sur une note latérale, emacs compilé avec le -ggdb3
drapeau prend environ 10 secondes de plus à charger; plus tôt, c'était 5-6 secondes, maintenant environ 16-17 secondes. Je connais les secondes exactes à cause d'un code qui calcule cela dans mon init. Cette augmentation du temps de démarrage est-elle attendue?
Note de bas de page 1: emacs se bloque systématiquement lors d'une undo-tree
tentative de restauration de l'historique d'annulation d'un fichier .org particulier (que je ne peux pas partager publiquement). Je l'ai (setq undo-tree-auto-save-history t)
. Ce plantage ne se produit que sur emacs git master, pas sur emacs 24.5. Sur emacs 24.5, undo-tree
génère une erreur indiquant qu'il est impossible de charger l'historique d'annulation (même si le fichier historique d'annulation existe), mais au moins la session emacs ne se bloque pas sur cette version.
undue-tree
problèmes, mais elle a un potentiel plus large .undo-tree
réponse spécifique car je sais qu'il serait difficile pour quelqu'un d'autre de recréer ce crash exact. Je ne peux pas non plus partager l'intégralité du fichier org, qui est le seul qui semble provoquer ce plantage. J'ai donc appliqué uniquement lagdb
balise à cette question. J'ai donné cette histoire en arrière afin que les réponses puissent me guider sur la façon de déboguer un crash emacs en général afin que je puisse déposer un rapport de bogue emacs utile .Réponses:
La façon la plus simple de déboguer un crash Emacs est de démarrer Emacs sous
gdb
, puis de faire tout ce qui reproduit le crash.En supposant que vous construisez vos Emacs à partir des sources, vous devez passer
CFLAGS="-O0 -g3"
au./configure
script. Cela fait que le compilateur C désactive les optimisations (ce qui peut rendre les choses confuses lors du débogage) et active le maximum d'informations de débogage dans l'exécutable. Courezmake
pour construire Emacs.Ensuite, démarrez à
gdb
partir dusrc
répertoire de votre arborescence Emacs:Sur OSX, vous voudrez passer
--with-ns
au./configure
script et démarrer gdb sur Emacs à l'intérieur de l'application créée:La raison de commencer à partir du
src
répertoire est qu'il existe un.gdbinit
fichier qui définit des définitions de fonction GDB utiles pour le débogage d'Emacs. Si ce fichier a été chargé, vous devriez voir quelque chose comme ça au démarragegdb
:Tapez
r
pour démarrer Emacs. Vous pouvez passer des arguments supplémentaires sur la même ligne, par exempler --debug-init
.Essayez ensuite de faire planter Emacs. S'il se bloque, vous devriez voir une note à ce sujet
gdb
et vous serez de nouveau laissé à l'(gdb)
invite. Si Emacs ne plante pas, mais se bloque, vous pouvez frapperC-z
dans le terminal où vous exécutezgdb
pour revenir à l'invite.Une fois à l'invite, tapez
bt
pour obtenir une trace. En prime, si le.gdbinit
fichier Emacs a été correctement chargé, vous verrez une trace Lisp après la trace C. Les deux backtraces sont des éléments très utiles à inclureM-x report-emacs-bug
.Il y a beaucoup plus d'informations, y compris comment examiner l'état des variables, etc., dans le
etc/DEBUG
fichier de l'arborescence Emacs. Vous pouvez l'ouvrir en tapantC-h C-d
dans Emacs, ou vous pouvez le lire en ligne .la source
emacs-buffer.gdb
fait et comment l'utiliser.src/
. Je l'ai trouvélib-src/
mais cela n'a pas fonctionnégdb ./emacsclient -a '' -c
. J'ai donc besoin d'aide pour transmettre ces arguments-a
et ces-c
arguments à emacsclient plutôt qu'à gdb.