Przerwać ocenę i obserwować aktualny stos w debuggerze emacs-lisp?

17

Jeśli niektóre funkcje emacs-lisp, takie jak przechwytywanie trybu głównego, trwają dłużej niż oczekiwano, czasami chciałbym je przerwać i spojrzeć na aktualny stos. Idealnie chciałbym również móc przeglądać wartości zmiennych i tak dalej w debuggerze. Nie mówię o kodzie, który celowo wykonuję w trybie emacs-lisp, ale raczej o kodzie, który jest wykonywany podczas normalnej pracy emacsa.

Jak mogę przerwać wykonywanie kodu emacs-lisp bezpośrednio w emacsie? Nie wiem z góry, którą funkcję muszę debugować.

Na przykład pisanie C-g, chociaż przerywa wykonywanie, nie mówi mi też nic o tym, która funkcja została przerwana.

Cyryl
źródło

Odpowiedzi:

18

Możesz C-guruchomić wyzwalacz debugera, włączając go debug-on-quit. Po prostu zrób

M-x toggle-debug-on-quit

Teraz za każdym razem, gdy trafisz, C-gzobaczysz ślad tego, co się działo. Ten ślad zwrotny jest interaktywny, więc możesz ciągle przechodzić między funkcjami di możesz zacząć się wyprowadzać c. (Spróbuj, łatwiej zobaczyć niż czytać).

Jest to ten sam ślad, który otrzymujesz, dodając (debug)kod. Oto krótki post na blogu i odpowiednia strona podręcznika Elisp .

Malabarba
źródło
(potulnie mówi hello);) Niesamowita notatka, że ​​debugger jest interaktywny - nigdy nie myślałem, żeby to sprawdzić :)
Sean Allred
@SeanAllred tak, dowiedziałem się dopiero kilka tygodni temu.
Malabarba