Debug di un Emacs congelato


48

Sto usando mew per la mia e-mail. Devo usare TLS con il mio provider di posta elettronica per SMTP. Tuttavia, quando provo a invocarlo, Emacs si blocca.

Vorrei cogliere l'occasione per saperne di più sui pacchetti Emacs. Come farei per eseguire il debug di questo problema? Esiste una sorta di debugger integrato, come in Common Lisp? Potrei usare la registrazione?


3
Come si "invoca questo"? Se si utilizza un comando Emacs definito in Lisp, è possibile (1) caricare il codice sorgente che definisce il comando, (2) utilizzare M-x debug-on-entry THE-COMMAND, quindi scorrere il debugger utilizzando d(o talvolta cper saltare alcuni passaggi). Mantenere il codice sorgente aperto in un altro frame, in modo da poter seguire ciò che sta facendo il debugger. Segnala ciò che vedi qui o, se ritieni che suggerisca un bug di Emacs, utilizzando M-x report-emacs-bug.
Disegnò il

Risposte:


45

Prima di ricorrere gdb, se stai utilizzando un sistema operativo Unix-y, puoi provare a inviare SIGUSR2al processo Emacs, come documentato nel DEBUGfile menzionato nell'altra risposta.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Ciò farà tentare ad Emacs di uscire dal suo loop corrente nel debugger di Lisp.

O usa questo uno strato senza digitare manualmente emacs pid:

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

In alternativa, se killallè disponibile:

$ killall -USR2 emacs

1
Ho dovuto farlo due volte (beh, avrei potuto aspettare più di 1 secondo prima di riprovare :-). Ad ogni modo, ha individuato il problema (un'elaborazione del blocco dei caratteri troppo lenta per una linea lunga).
Stéphane Gourichon,

font-lock è noto per bloccare Emacs: se un matcher si innesca ma non sposta il punto in avanti, si riavvierà per sempre.
Lindydancer,

wow, è stato fantastico. Non sei ancora sicuro di cosa stia causando il mio problema, ma quel trucco è un vero toccasana, grazie!
Matt,

3
Sul mio sistema, l'oneliner può essere semplificato in "killall -USR2 emacs" (evita ovviamente se hai più processi Emacs).
YoungFrog

1
Consiglia htop ( en.wikipedia.org/wiki/Htop ) per questo. /per cercare emacse kinviare il segnale. Anche Activity Monitor su Mac può farlo (dal menu: Visualizza | Invia segnale da elaborare).
Lassi,

36

Se il blocco scompare quando si colpisce C-g, è possibile utilizzare il debugger integrato. Digitare M-x toggle-debug-on-quitprima di inviare il messaggio, premere C-gquando si blocca e ispezionare il *Backtrace*buffer che si presenta.

Se C-gnon aiuta, probabilmente il blocco si verifica nel codice C e sarà necessario utilizzare un debugger esterno come gdb. Premi C-h C-dper vedere il DEBUGfile che fornisce alcuni suggerimenti su come farlo. (Puoi anche leggere il file DEBUG nell'interfaccia web del repository Emacs .) Questa risposta fornisce ulteriori dettagli sull'uso gdbdi Emacs.


Potrebbe essere necessario colpire C-gpiù volte: C-g C-g C-g.
Disegnò il

@Drew Ho anche notato che è necessario colpirlo più volte. Sai perché?
Wilfred Hughes,

2
Sì. Vedere il manuale di Emacs, nodoQuitting . Come l'ho trovato? C-h r i, quindi digitare "Cg" e premere RET.
Tracciò il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.