Debugowanie zamrożonego Emacsa

48

Używam mew do mojego e-maila. Muszę używać TLS z moim dostawcą poczty e-mail dla SMTP. Jednak gdy próbuję to przywołać, Emacs zawiesza się.

Chciałbym skorzystać z okazji, aby dowiedzieć się więcej o pakietach Emacsa. Jak mam przejść do debugowania tego problemu? Czy jest jakiś wbudowany debugger, taki jak w Common Lisp? Czy mogę użyć rejestrowania?

Svante
źródło
3
Jak to „wywołujesz”? Jeśli używasz polecenia Emacsa zdefiniowanego w Lisp, możesz (1) załadować kod źródłowy, który definiuje polecenie, (2) użyj M-x debug-on-entry THE-COMMAND, a następnie przejdź przez debugger za pomocą d(lub czasami cpomiń niektóre kroki). Trzymaj kod źródłowy otwarty w innej ramce, abyś mógł śledzić, co robi debugger. Zgłoś, co tu widzisz lub, jeśli uważasz, że sugeruje to błąd Emacsa, używając M-x report-emacs-bug.
Drew

Odpowiedzi:

44

Zanim zaczniesz uciekać się gdb, jeśli używasz systemu operacyjnego Unix-y, możesz spróbować wysłać SIGUSR2go do procesu Emacsa, jak udokumentowano w DEBUGpliku wymienionym w innej odpowiedzi.

$ kill -SIGUSR2 <emacs_pid_goes_here>

Spowoduje to, że Emacs spróbuje wydostać się z bieżącej pętli do debuggera Lisp.

Lub użyj tej jednej linijki bez ręcznego wpisywania emacs pid:

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

Alternatywnie, jeśli killalljest dostępny:

$ killall -USR2 emacs
Dmitry
źródło
1
Musiałem to zrobić dwa razy (cóż, mogłem poczekać ponad 1 sekundę przed ponowną próbą :-). W każdym razie wskazał problem (zbyt długie przetwarzanie blokowania czcionek dla długiej linii).
Stéphane Gourichon
blokada czcionek powoduje zawieszenie się Emacsa - jeśli wyzwalacz dopasowywania nie przesunie punktu do przodu, uruchomi się ponownie na zawsze.
Lindydancer
wow, to było niesamowite. Nadal nie jestem pewien, co jest przyczyną mojego problemu, ale ta sztuczka ratuje życie, dziękuję!
Matt
3
W moim systemie oneliner można uprościć do 'killall -USR2 emacs' (oczywiście, jeśli masz wiele procesów Emacsa).
YoungFrog,
1
Polecam do tego htop ( en.wikipedia.org/wiki/Htop ). /szukać emacsi kwysłać sygnał. Monitor aktywności na komputerze Mac może to również zrobić (z menu: Widok | Wyślij sygnał do przetwarzania).
Lassi
36

Jeśli zamrożenie zniknie po trafieniu C-g, możesz użyć wbudowanego debugera. Wpisz M-x toggle-debug-on-quitprzed wysłaniem wiadomości, naciśnij, C-ggdy się zawiesza, i sprawdź *Backtrace*bufor, który się pojawi.

Jeśli C-gto nie pomoże, prawdopodobnie zamrożenie występuje w kodzie C i będziesz musiał użyć zewnętrznego debuggera, takiego jak gdb. Kliknij, C-h C-daby zobaczyć DEBUGplik, który zawiera pewne wskazówki, jak to zrobić. (Możesz również odczytać plik DEBUG w interfejsie internetowym repozytorium Emacs .) Ta odpowiedź zawiera więcej szczegółów na temat korzystania gdbz Emacsa.

legoscia
źródło
Może trzeba trafić C-gkilka razy: C-g C-g C-g.
Drew
@Drew Zauważyłem również, że kilkakrotne uderzenie jest konieczne. Wiesz dlaczego?
Wilfred Hughes
2
Tak. Zobacz podręcznik Emacsa, węzełQuitting . Jak to znalazłem? C-h r i, a następnie wpisz „Cg” i naciśnij RET.
Drew