Como depurar uma falha do emacs?

16

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.gdbmas 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 -ggdb3bandeiras.

Como não tenho experiência anterior, gdbtentei algumas tentativas fracassadas de usar o emacs-buffer.gbdarquivo.

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 -ggdb3bandeira 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-treetenta 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-treegera 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.

Kaushal Modi
fonte
2
Estou usando mais de dois anos no Emacs e ainda não o descobri: stackoverflow.com/q/20891431/2112489 Para ser sincero, é um mistério e deve haver um tópico autoritário que ensina como fazer isto.
lawlist
Tudo bem, a questão é obter a contagem de visualizações, mas não há votos positivos. Deixe-me saber se você precisa de mim para melhorar a pergunta. Se você acha que a pergunta pode dar uma boa resposta e pode ser útil para a comunidade emacs, faça um voto positivo para que chame a atenção de um possível respondente.
precisa
Não quero invadir seu tópico, mas farei uma sugestão. Se o tópico não atrair uma resposta adequada dentro de um período de tempo razoável (ou seja, você decide o que isso significa), pode valer a pena tornar esse tópico mais geral - por exemplo, o tópico oficial sobre como usar o gdb para depurar o Emacs falhas, crie backtraces significativos que ajudarão os gurus da equipe de desenvolvimento do Emacs a diagnosticar / solucionar problemas ao receber um relatório de erro que contém essas informações. Entendo que a questão é importante por causa de undue-treeproblemas, mas tem um potencial mais amplo .
lawlist
@lawlist Isso é exatamente o que eu espero que esse tópico seja. Eu não esperava uma undo-treeresposta 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 a gdbtag 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 .
Kaushal Modi
@lawlist Reformulei a pergunta para que fique claro que ela não é específica para nenhum pacote.
Kaushal Modi

Respostas:

15

A maneira mais fácil de depurar uma falha do Emacs é iniciar o Emacs abaixo gdbe, 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 ./configurescript. 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. Corra makepara criar o Emacs.

Em seguida, inicie gdbde dentro do srcdiretório da sua árvore do Emacs:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

No OSX, você desejará passar --with-nspara o ./configurescript e iniciar o gdb no Emacs dentro do aplicativo criado:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

O motivo para iniciar a partir do srcdiretório é que existe um .gdbinitarquivo 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 iniciar gdb:

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

Digite rpara iniciar o Emacs. Você pode passar argumentos extras na mesma linha, por exemplo r --debug-init.

Em seguida, tente fazer o Emacs travar. Se ele travar, você verá uma observação gdbe será (gdb)novamente solicitado. Se o Emacs não travar, mas congelar, você pode bater C-zno terminal em que está executando gdbpara voltar ao prompt.

Uma vez no prompt, digite btpara obter um retorno. Como bônus, se o .gdbinitarquivo Emacs foi carregado corretamente, você verá um backtrace do Lisp após o backtrace C. Ambos os backtraces são coisas muito úteis para incluir M-x report-emacs-bug.


Há muito mais informações, incluindo como examinar o estado das variáveis, etc., no etc/DEBUGarquivo na árvore do Emacs. Você pode abri-lo digitando C-h C-ddentro do Emacs ou pode lê-lo online .

legoscia
fonte
Obrigado. Hoje vou encontrar tempo para experimentar sua solução. Ainda estou curioso sobre o que emacs-buffer.gdbfaz e como usá-lo.
Kaushal Modi
Pelo que entendi, isso é especificamente para recuperar o conteúdo do arquivo que você estava editando quando o Emacs travou. Como o Emacs salva automaticamente a cada 30 segundos e a cada 300 teclas, eu diria que isso é de uso limitado.
legoscia
1
Mas isso também deve ajudar a recuperar buffers que não são de arquivo, está correto? Minha idéia era usar isso para ver o que * Messages * e * Backtrace * tinham pouco antes do acidente.
Kaushal Modi
Ah, esse é um bom argumento. Eu nunca o usei, então não tenho certeza de como fazê-lo.
legoscia 31/07/2015
Você sabe como executar o gdb no emacsclient? Não consigo encontrar esse binário em src/. Eu o encontrei, lib-src/mas isso não funcionou gdb ./emacsclient -a '' -c. Então, preciso de ajuda sobre como passar esses -ae -cargumentos para o emacsclient em vez de para o gdb.
Kaushal Modi