Meglio il debug di crash di Emacs?


9

Sebbene Emacs (24.3.93.1) funzioni correttamente se avviato dal Finder, se viene avviata la versione del terminale:

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

Emacs si arresta in modo anomalo con:

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

Sembra che il problema sia causato da una singola riga in init.el,

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

Se la riga viene commentata, anche la versione terminale di Emacs inizierà bene.

Per individuare la causa dell'incidente mi ci sono volute diverse ore (diminuendo il mio init.el della metà della metà).

Sono consapevole che in ogni caso Emacs erediterà qualsiasi carattere e dimensione del carattere siano specificati nell'app del terminale (in pratica, quella linea non è significativa nel cli.)

  1. In generale, esiste un modo migliore per eseguire il debug di un Emacs in crash? Forse usando un qualche tipo di debugger cli che stamperebbe un messaggio più descrittivo?
  2. Perché quella linea si blocca su Emacs tramite cli, ma non se viene lanciata dal Finder?

si sta davvero lanciando dal cli? o l'avvio della versione del terminale che causa il problema? Prova a mettere un po 'di errore nell'attributo set-face? (condition-case err (set-face-Attribute ...) (errore (messaggio "Whoops!")))
nic ferrier

3
Invia una segnalazione di bug. Emacs non dovrebbe mai andare in crash a causa del codice lisp. Ma questo potrebbe essere un problema con la build specifica che stai usando, è la versione ufficiale?
Malabarba,

@ nic-ferrier: ora ho solo una riga in init.el, (condition-case err (set-face-attribute 'default nil :font "Menlo-16") (error (message "Whoops!")))ho ancora lo stesso crash con lo stesso messaggio di errore. Nessun messaggio aggiuntivo di origine elisp.
gsl,

@ Malabarba: ho provato con GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2013-03-13 on bob.porkrind.orgda emacsformacosx.com , e Emacs non va in crash. Quindi, deve essere un bug nelle versioni successive. Devo presentare una segnalazione di bug.
gsl,

1
Come @Malabarba indicato: un bug report (immediatamente): M-x report-emacs-bug. Gli sviluppatori di Emacs ti guideranno attraverso ciò che puoi fare per aiutarti a eseguire il debug del problema.
Drew

Risposte:


6

Per aiutarti a rintracciarlo la prossima volta

Questo mi è successo prima. C'è stata una situazione in cui string-to-intEmacs si è schiantato e mi ci sono volute ore anche per individuare.
Spiacenti, non posso fornire una risposta migliore, ma gli arresti anomali di Emacs si verificano nel profondo del codice C e non sono disponibili strumenti integrati per rintracciare tali problemi.

Suppongo che il debug gdbsia possibile, ma la sua efficacia dipenderà dalla tua competenza gdb.

Quello che devi davvero fare è

Invia una segnalazione di bug

Il codice elisp puro (non compilato in byte) non dovrebbe mai arrestare Emacs. Potrebbe causare un blocco (a causa di un loop infinito) e potrebbe causare l'esaurimento della memoria di Emacs. Ma oltre a ciò, ogni incidente è un bug .

M-x report-emacs-bug

Fornire semplicemente questo esempio minimamente funzionante che hai trovato, insieme a una descrizione della tua build e del tuo sistema, dovrebbe essere un aiuto sufficiente per i gentili sviluppatori.


2
Usare gdb sarebbe l'unico modo. Potremmo aggiungere roba ad Emacs per racchiudere ogni chiamata C in qualcosa che si catturerebbe da sé ma che sarebbe sempre sovraccarico. Emacs non dovrebbe andare in crash, se lo fa dovremmo gestire specificamente quel bug in modo che non lo faccia più. Quindi sì, se è rotto, invia un bug. Usa gdb con tutti i mezzi per scoprire assolutamente dove si trova il bug.
Nic Ferrier,

4

Come riferimento al debug con gdb ti consigliamo di usare src / temacs dall'albero della build. Questo è Emacs senza l'elisp pre-scaricato che confonde il debugger.

gdb --args src/temacs -nw

1
Grazie, un consiglio eccellente (e non troppo facile da trovare anche in giro). Grazie.
gsl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.