Debuguję, dlaczego emacs ulega awarii podczas używania funkcji z pakietu 1 . Celem tego procesu debugowania jest uzyskanie użytecznych danych do przesłania M-x report-emacs-bug
.
Aby uzyskać pomoc na temat debugowania awarii emacsa, przejrzałem już Podręcznik Emacsa - Awarie i Podręcznik Emacsa - Po awarii , ale one nie pomogły.
Podręcznik After A Crash odnosi się do, emacs-buffer.gdb
ale nie mam pojęcia, jak go używać. Pytając google o pomoc, natknąłem się na to pytanie emacs.SE i ponownie skompilowałem emacsa używając -ggdb3
flag.
Nie mam wcześniejszego doświadczenia z używaniem, gdb
więc próbowałem kilku nieudanych prób użycia emacs-buffer.gbd
pliku.
Oto, co próbowałem:
gdb -x /path/to/emacs-buffer.gdb
gdb
->file /path/to/emacs-buffer.gdb
gdb
->source /path/to/emacs-buffer.gdb
source /path/to/emacs-buffer.gdb
Na marginesie, -ggdb3
załadowanie emacsa skompilowanego z flagą zajmuje około 10 sekund dłużej; wcześniej było to 5-6 sekund, teraz około 16-17 sekund. Znam dokładne sekundy z powodu kodu, który oblicza to w moim init. Czy spodziewany jest wzrost czasu uruchamiania?
Przypis 1: emacs stale się zawiesza, gdy undo-tree
próbuje przywrócić historię cofania dla określonego pliku .org (którego nie mogę udostępnić publicznie). Mam (setq undo-tree-auto-save-history t)
. Ta awaria zdarza się tylko na emacs git master, a nie na emacs 24.5. W undo-tree
systemie emacs 24.5 zgłasza błąd informujący, że nie można załadować historii cofania (nawet za pośrednictwem pliku historii cofnięć), ale przynajmniej sesja emacs nie ulega awarii w tej wersji.
undue-tree
problemów, ale ma szerszy potencjał .undo-tree
odpowiedzi specyficznej, ponieważ wiem, że odtworzenie tej katastrofy byłoby trudne. Nie mogę też udostępnić całego pliku org, który jako jedyny wydaje się powodować awarię. Zastosowałem więc tylkogdb
tag do tego pytania. Opowiedziałem tę historię, aby odpowiedzi pomogły mi w ogólnym debugowaniu awarii emacsa, dzięki czemu mogę złożyć użyteczny raport o błędach emacsa .Odpowiedzi:
Najłatwiejszym sposobem debugowania awarii Emacsa jest uruchomienie Emacsa pod
gdb
, a następnie zrobienie czegokolwiek, co odtworzy awarię.Zakładając, że budujesz Emacsa ze źródła, powinieneś przejść
CFLAGS="-O0 -g3"
do./configure
skryptu. To powoduje, że kompilator C wyłącza optymalizacje (co może wprowadzać zamieszanie podczas debugowania) i aktywuje maksymalne informacje debugowania w pliku wykonywalnym. Uruchom,make
aby zbudować Emacsa.Następnie zacznij
gdb
odsrc
katalogu z drzewa Emacsa:W OSX będziesz chciał przejść
--with-ns
do./configure
skryptu i uruchomić gdb na Emacsie wewnątrz utworzonej aplikacji:Powodem do uruchomienia z
src
katalogu jest to, że istnieje.gdbinit
plik, który konfiguruje przydatne definicje funkcji GDB do debugowania Emacsa. Jeśli ten plik został załadowany, powinieneś zobaczyć coś takiego podczas uruchamianiagdb
:Wpisz,
r
aby uruchomić Emacsa. Możesz przekazać dodatkowe argumenty w tym samym wierszu, npr --debug-init
.Następnie spróbuj spowodować awarię Emacsa. Jeśli się zawiesi, powinieneś zobaczyć notatkę na ten temat
gdb
, a(gdb)
ponownie pojawi się monit. Jeśli Emacs się nie zawiesi, ale zawiesi, możesz nacisnąćC-z
terminal, w którym biegniesz,gdb
aby wrócić do monitu.Po wyświetleniu monitu wpisz,
bt
aby uzyskać ślad. Jako bonus, jeśli.gdbinit
plik Emacsa został poprawnie załadowany, po śladzie C zobaczysz ślad Lisp. Oba ślady są bardzo przydatnymi rzeczami do włączeniaM-x report-emacs-bug
.W
etc/DEBUG
pliku w drzewie Emacsa znajduje się znacznie więcej informacji, w tym jak sprawdzić stan zmiennych itp . Możesz go otworzyć, wpisującC-h C-d
wewnątrz Emacsa, lub możesz przeczytać go online .źródło
emacs-buffer.gdb
robi i jak z niego korzystać.src/
. Znalazłem to,lib-src/
ale to nie działałogdb ./emacsclient -a '' -c
. Potrzebuję więc pomocy, jak przekazać te-a
i-c
argumenty emacsclient zamiast gdb.