Powiedzmy, że emacs generuje błąd, którego nie rozumiem. A może błąd mówi „Wartość symbolu jako zmienna jest nieważna: tryby”, ale modes
w moim kodzie jest wiele wystąpień tego symbolu , więc potrzebuję trochę kontekstu. Czy Emacsa można skonfigurować tak, aby podawał numer wiersza kodu lisp, aby wiedzieć, który kod powoduje błąd?
Próbowałem to zrobić (setq stack-trace-on-error '(buffer-read-only))
i uruchomiłem odpowiedni kod, aby uzyskać ślad stosu. Brak śladu stosu.
Próbowałem także wywołać edebug-defun
moją funkcję i przejść przez nią. Błąd pojawia się dopiero po wyjściu z funkcji.
(Naprawdę nie jestem tak zainteresowany przyczyną konkretnego błędu, jaki napotykam obecnie, jak rozwijaniem ogólnych umiejętności debugowania dla elisp. Proszę doradzić, jak mogę uzyskać numer linii, seksu lub ślad stosu z błąd.)
źródło
nil
debug-on-error
? Czy to nie pomaga?t
a następnie przejściu do ewaluacji funkcji zgłaszania błędów)debug-ignored-errors
czy nie zawiera żadnych błędów. Jeśli wybierzeszdebug-on-signal
opcjęnil
inną niż , i tak było w przypadku, gdy inny kod obsługiwał błąd, będziesz w stanie uzyskać błąd, zanim zrobi to drugi kod.Odpowiedzi:
Emacs zapewnia dobrą ilość debugowanie obiekty w tym
M-x toggle-debug-on-error
,M-x toggle-debug-on-quit
, debugowania sygnału (który może być używany przez wysłanieUSR2
do Emacs od zewnątrz),debug-on-entry
(z funkcji),debug-on-message
(po obejrzeniu meczu specyficzny regexp komunikatu) i wreszciedebug
się jako alternatywa do instrumentowania funkcji za pomocąC-u C-M-x
.Zarówno
debug
iedebug
oferuje wystarczającą funkcjonalność wglądu do stanu z Emacs przy ocenie kod, który cię interesuje, hite
i wprowadź wyraz.Jednak podczas gdy
edebug
przeskakuje do miejsca w funkcji instrumentowanej i dlatego daje ci wskazówkę, gdzie szukać (co jest trochę głupie, ponieważ już wiesz, co dokładnie instrumentowałeś),debug
wcale tego nie robi. Ściągnąłem mniejszy hack po odkryciu, że ilekroćdebug
ocenia bufor, emituje wartość punktu związanego z błędem; innymi słowy, użycie tej informacji w buforze może dać ci numer linii w śladzie wstecznym!Dzięki temu należy odpowiedzieć na pierwotne pytanie w tytule. Jeśli chodzi o twój problem z uzyskaniem śladu wstecznego, brakuje mi przydatnych pomysłów.
źródło
M-x debug
... Więc co mam nacisnąć?debug
, można sprawdzić odwiedzając uszkodzony plik Elisp, robiM-x toggle-debug-on-error
iM-x eval-buffer
, a następnie backtrace z numerem linii w problematycznej pozycji powinno wyskoczyć.eval-buffer
? Na przykład, jeśli po prostu naciśniesz skrót klawiaturowy, który uruchamia prywatne polecenie, które kończy się niepowodzeniem i otwiera debugger w*Backtrace*
buforze ..Może dlatego, że jest teraz 2018, ale w moim przypadku musiałem włączyć debugowanie tylko tak, jak sugeruje wasamasa: Mx toggle-debug-on-error
Następnie bufor ewaluacyjny Mx na moim wadliwym pliku Elisp podał kontekst, podając pozycję błędu, jak poniżej:
Debugger entered--Lisp error: (invalid-read-syntax ")") eval-buffer() ; Reading at buffer position 523 [....]
MX goto-char przeskakuje do pozycji błędu:
M-x goto-char 523
źródło
Rozszerzyłem odpowiedź wasamasa o dodatkowe informacje:
źródło