Depurando um Emacs congelado

48

Estou usando mew para o meu email. Preciso usar o TLS com meu provedor de email para SMTP. No entanto, quando tento invocar isso, o Emacs congela.

Gostaria de aproveitar esta oportunidade para aprender mais sobre os pacotes Emacs. Como eu iria depurar esse problema? Existe algum tipo de depurador interno, como no Common Lisp? Eu poderia usar o log?

Svante
fonte
3
Como você "invoca isso"? Se estiver usando um comando Emacs definido no Lisp, você poderá (1) carregar o código-fonte que define o comando, (2) usar e M-x debug-on-entry THE-COMMAND, em seguida, percorrer o depurador usando d(ou algumas vezes cpara pular algumas etapas). Mantenha o código-fonte aberto em outro quadro, para poder seguir o que o depurador está fazendo. Relate o que você vê aqui ou, se você acha que isso sugere um bug do Emacs, usando M-x report-emacs-bug.
Tirou

Respostas:

44

Antes de recorrer gdb, se você estiver usando um sistema operacional Unix-y, tente enviar SIGUSR2para o processo Emacs, como documentado no DEBUGarquivo mencionado na outra resposta.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Isso fará com que o Emacs tente interromper seu loop atual no depurador Lisp.

Ou use este liner sem digitar o emacs pid manualmente:

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

Como alternativa, se killallestiver disponível:

$ killall -USR2 emacs
Dmitry
fonte
1
Tive que fazer isso duas vezes (bem, eu poderia ter esperado mais de um segundo antes de tentar novamente :-). De qualquer forma, ele identificou o problema (um processamento de bloqueio de fonte muito lento para uma longa fila).
Stéphane Gourichon
O bloqueio de fonte é conhecido por travar o Emacs - se um matcher disparar, mas não avançar o ponto, ele será acionado para sempre.
Lindydancer
uau, isso foi incrível. Ainda não tenho certeza do que está causando o meu problema, mas esse truque é um salva-vidas, obrigado!
23416 Matt
3
No meu sistema, o oneliner pode ser simplificado para 'killall -USR2 emacs' (evite se você tiver vários processos do Emacs, é claro).
YoungFrog
1
Recomende o htop ( en.wikipedia.org/wiki/Htop ) para isso. /para procurar emacse kenviar o sinal. O Activity Monitor em um Mac também pode fazer isso (no menu: Exibir | Enviar sinal para processo).
Lassi
36

Se o congelamento desaparecer quando você pressionar C-g, poderá usar o depurador embutido. Digite M-x toggle-debug-on-quitantes de enviar a mensagem, pressione C-gquando congela e inspecione o *Backtrace*buffer que aparece.

Se C-gisso não ajudar, o congelamento provavelmente acontece no código C e você precisará usar um depurador externo como gdb. Clique C-h C-dpara ver o DEBUGarquivo que fornece algumas dicas sobre como fazer isso. (Você também pode ler o arquivo DEBUG na interface da Web do repositório do Emacs .) Esta resposta entra em mais detalhes sobre como usar gdbcom o Emacs.

legoscia
fonte
Você pode ter que bater C-gvárias vezes: C-g C-g C-g.
Tirou
@ Drew Eu também notei que acertá-lo várias vezes é necessário. Você sabe por quê?
Wilfred Hughes
2
Sim. Veja o manualQuitting do Emacs, nó . Como eu achei isso? C-h r i, digite "Cg" e pressione RET.
Tirou