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?


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.