Estou depurando por que o emacs falha ao usar uma função de um pacote 1 . O objetivo deste processo de depuração é obter dados úteis para enviar usando M-x report-emacs-bug
.
Para obter ajuda sobre como depurar falhas do emacs, eu já consultei o Manual do Emacs - Crashing e Manual do Emacs - Após um Crash , mas eles não ajudaram.
O manual After A Crash se refere, emacs-buffer.gdb
mas não tenho idéia de como usá-lo. Ao pedir ajuda ao google, me deparei com essa pergunta do emacs.SE e recompilei o emacs usando as -ggdb3
bandeiras.
Como não tenho experiência anterior, gdb
tentei algumas tentativas fracassadas de usar o emacs-buffer.gbd
arquivo.
Aqui está o que eu tentei:
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
Em uma nota lateral, o emacs compilado com a -ggdb3
bandeira leva cerca de 10 segundos a mais para carregar; antes, eram 5-6 segundos, agora cerca de 16 a 17 segundos. Eu sei os segundos exatos por causa de um código que calcula isso no meu init. É esperado um aumento no tempo de inicialização?
Nota de rodapé 1: o emacs falha constantemente quando undo-tree
tenta restaurar o histórico de desfazer de um arquivo .org específico (que não posso compartilhar publicamente). Eu tenho (setq undo-tree-auto-save-history t)
. Essa falha ocorre apenas no emacs git master, não no emacs 24.5. No emacs 24.5, undo-tree
gera um erro informando que não é possível carregar o histórico de desfazer (mesmo que exista o arquivo de histórico de desfazer), mas pelo menos a sessão do emacs não falha nessa versão.
undue-tree
problemas, mas tem um potencial mais amplo .undo-tree
resposta específica, porque sei que seria difícil para qualquer outra pessoa recriar a falha exata. Também não consigo compartilhar o arquivo organizacional inteiro, que é o único que parece causar esse travamento. Então, apliquei apenas agdb
tag a esta pergunta. Eu contei essa história para que as respostas possam me orientar como depurar uma falha do emacs em geral, para que eu possa registrar um relatório útil de erro do emacs .Respostas:
A maneira mais fácil de depurar uma falha do Emacs é iniciar o Emacs abaixo
gdb
e, em seguida, fazer o que for que reproduz a falha.Supondo que você esteja construindo seu Emacs a partir da fonte, você deve passar
CFLAGS="-O0 -g3"
para o./configure
script. Isso faz com que o compilador C desative as otimizações (que podem tornar as coisas confusas durante a depuração) e ativa o máximo de informações de depuração no executável. Corramake
para criar o Emacs.Em seguida, inicie
gdb
de dentro dosrc
diretório da sua árvore do Emacs:No OSX, você desejará passar
--with-ns
para o./configure
script e iniciar o gdb no Emacs dentro do aplicativo criado:O motivo para iniciar a partir do
src
diretório é que existe um.gdbinit
arquivo que define definições úteis de funções do GDB para depurar o Emacs. Se esse arquivo foi carregado, você deve ver algo assim ao iniciargdb
:Digite
r
para iniciar o Emacs. Você pode passar argumentos extras na mesma linha, por exemplor --debug-init
.Em seguida, tente fazer o Emacs travar. Se ele travar, você verá uma observação
gdb
e será(gdb)
novamente solicitado. Se o Emacs não travar, mas congelar, você pode baterC-z
no terminal em que está executandogdb
para voltar ao prompt.Uma vez no prompt, digite
bt
para obter um retorno. Como bônus, se o.gdbinit
arquivo Emacs foi carregado corretamente, você verá um backtrace do Lisp após o backtrace C. Ambos os backtraces são coisas muito úteis para incluirM-x report-emacs-bug
.Há muito mais informações, incluindo como examinar o estado das variáveis, etc., no
etc/DEBUG
arquivo na árvore do Emacs. Você pode abri-lo digitandoC-h C-d
dentro do Emacs ou pode lê-lo online .fonte
emacs-buffer.gdb
faz e como usá-lo.src/
. Eu o encontrei,lib-src/
mas isso não funcionougdb ./emacsclient -a '' -c
. Então, preciso de ajuda sobre como passar esses-a
e-c
argumentos para o emacsclient em vez de para o gdb.