Lepsze debugowanie awarii Emacsa?

9

Chociaż Emacs (24.3.93.1) działa dobrze, jeśli zostanie uruchomiony z Findera, jeśli wersja terminalu zostanie uruchomiona:

/Applications/Emacs.app/Contents/MacOS/Emacs -nw

Emacs ulega awarii z:

Fatal error 11: Segmentation fault[1] 51512 abort /Applications/Emacs.app/Contents/MacOS/Emacs -nw.

Wygląda na to, że przyczyną problemu jest pojedyncza linia w init.el,

(set-face-attribute 'default nil :font "Menlo-16")

Jeśli linia ta zostanie skomentowana, terminalowa wersja Emacsa również zacznie działać poprawnie.

Ustalenie przyczyny awarii zajęło mi kilka godzin (zmniejszając mój init.el o pół).

Wiem, że w każdym przypadku Emacs odziedziczy dowolną czcionkę i rozmiar czcionki określony w aplikacji terminalowej (w zasadzie ta linia nie ma znaczenia w cli.)

  1. Mówiąc ogólnie, czy jest lepszy sposób na debugowanie awarii Emacsa? Być może przy użyciu jakiegoś debugera CLI, który wydrukowałby bardziej opisowy komunikat?
  2. Dlaczego ta linia powoduje awarię Emacsa przez cli, ale nie jest uruchamiana z Findera?
gsl
źródło
czy to naprawdę uruchamia się z CLI? lub uruchomienie wersji terminala, która powoduje problem? Spróbuj ustawić błąd wychwytywania wokół atrybutu set-face? (condition-case err (set-face-attribute ...) (błąd (komunikat „Ups!”)))
nic ferrier
3
Złóż raport o błędzie. Emacs nigdy nie powinien ulec awarii z powodu kodu lisp. Ale może to być problem z konkretną wersją, której używasz, czy jest to oficjalne wydanie?
Malabarba
@ nic-ferrier: Mam teraz tylko jedną linię w init.el, (condition-case err (set-face-attribute 'default nil :font "Menlo-16") (error (message "Whoops!")))wciąż mam tę samą awarię z tym samym komunikatem o błędzie. Brak dodatkowych wiadomości pochodzących z elisp.
gsl
@ Malabarba: Próbowałem z GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2013-03-13 on bob.porkrind.orgod emacsformacosx.com i Emacs nie psuje. W późniejszych wersjach musi to być błąd. Zgłoszę błąd.
gsl
1
Jak wskazano @Malabarba: to zgłosić (bezpośrednio) M-x report-emacs-bug. Programiści Emacsa poprowadzą cię przez to, co możesz zrobić, aby pomóc w debugowaniu problemu.
Drew

Odpowiedzi:

6

Aby pomóc Ci to wyśledzić następnym razem

Zdarzyło mi się to wcześniej. Była sytuacja, w której string-to-introzbił się Emacs, a także zajęło mi wiele godzin.
Niestety nie mogę podać lepszej odpowiedzi, ale awarie Emacsa zdarzają się głęboko w kodzie C i nie ma żadnych wbudowanych narzędzi do śledzenia takich problemów.

Wydaje mi się, że debugowanie go gdbjest możliwe, ale jego skuteczność będzie zależeć od twojej biegłości w posługiwaniu się nim gdb.

To, co naprawdę musisz zrobić, to

Złóż raport o błędzie

Czysty kod elisp (nieskompilowany bajtowo) nigdy nie powinien powodować awarii Emacsa. Może to spowodować zawieszenie się (z powodu nieskończonej pętli) i może spowodować brak pamięci w Emacsie. Ale poza tym każda awaria jest błędem .

M-x report-emacs-bug

Wystarczy podać ten minimalnie działający przykład, który wymyśliłeś, wraz z opisem twojej kompilacji i systemu, powinien być wystarczającą pomocą dla tego rodzaju programistów.

Malabarba
źródło
2
Korzystanie z gdb byłoby jedynym sposobem. Możemy dodać do Emacsa różne rzeczy, aby zawinąć każde wywołanie C w coś, co sam się wyłapie, ale to będzie cały czas narzut. Emacs nie powinien ulec awarii, jeśli tak się stanie, powinniśmy specjalnie zająć się tym błędem, aby już nie działał. Więc tak, jeśli jest zepsuty, zgłoś błąd. Użyj gdb wszelkimi sposobami, aby absolutnie dowiedzieć się, gdzie jest błąd.
nic ferrier
4

Jako odniesienie do debugowania z gdb będziesz chciał użyć src / temacs z drzewa kompilacji. To jest Emacs bez wstępnie zrzuconego elipa, który dezorientuje debugger.

gdb --args src/temacs -nw
stsquad
źródło
1
Dziękuję, doskonała rada (i niełatwo też znaleźć wokół). Dzięki.
gsl