Come posso eseguire il debug di un arresto anomalo di emacs?


16

Sto eseguendo il debug del motivo per cui emacs si arresta in modo anomalo quando si utilizza una funzione da un pacchetto 1 . Lo scopo di questo processo di debug è ottenere dati utili da inviare utilizzando M-x report-emacs-bug.

Per ottenere assistenza su come eseguire il debug degli arresti anomali di emacs, ho già esaminato il manuale Emacs - Crashing and Emacs Manual - After a Crash , ma non mi hanno aiutato.

Il manuale di After A Crash fa riferimento emacs-buffer.gdbma non ho idea di come usarlo. Mentre chiedevo aiuto a google, mi sono imbattuto in questa domanda emacs.SE e ho ricompilato emacs usando le -ggdb3bandiere.

Non ho alcuna esperienza precedente nell'uso gdbe quindi ho provato alcuni tentativi falliti di utilizzare il emacs-buffer.gbdfile.

Ecco cosa ho provato:

  • 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

Su una nota a margine, gli emacs compilati con il -ggdb3flag impiegano circa 10 secondi in più per caricarsi; prima erano 5-6 secondi, ora circa 16-17 secondi. Conosco i secondi esatti a causa di un codice che calcola quello nel mio init. Si prevede un aumento del tempo di avvio?


Nota 1: emacs si arresta in modo anomalo in modo coerente quando undo-treetenta di ripristinare la cronologia degli annullamenti per un determinato file .org (che non posso condividere pubblicamente). Io ho (setq undo-tree-auto-save-history t). Questo crash si verifica solo su emacs git master, non su emacs 24.5. Su emacs 24.5, undo-treegenera un errore che indica che non è in grado di caricare la cronologia degli annullamenti (anche se esiste il file della cronologia degli annullamenti), ma almeno la sessione di emacs non si arresta in modo anomalo su quella versione.


2
Sono più di due anni che uso Emacs e ancora non l'ho ancora capito: stackoverflow.com/q/20891431/2112489 Ad essere onesti, è un po 'un mistero e dovrebbe esserci un filo autorevole che insegna come fare esso.
elenco delle leggi del

Va bene, la domanda è ottenere conteggi delle visualizzazioni, ma nessun voto. Fammi sapere se hai bisogno di me per migliorare la domanda. Se ritieni che la domanda possa dare una buona risposta e possa essere utile per la comunità di emacs, ti preghiamo di votarla in modo che attiri l'attenzione di un potenziale risponditore.
Kaushal Modi,

Non voglio dirottare il tuo thread, ma darò un suggerimento. Se il thread non attira una risposta adeguata entro un ragionevole periodo di tempo (vale a dire, decidi cosa significa), può essere utile rendere questo thread più generale - ad esempio, il thread autorevole su come usare gdb per eseguire il debug di Emacs si arresta in modo anomalo, crea backtracce significative che aiuteranno i guru del team di sviluppo di Emacs a diagnosticare / risolvere i problemi quando ricevono una segnalazione di bug che contiene tali informazioni. Comprendo che il problema è importante a causa di undue-treeproblemi, ma ha un potenziale più ampio .
elenco delle leggi

@lawlist Questo è esattamente ciò che mi aspetto che questa discussione sia. Non mi aspettavo una undo-treerisposta specifica perché so che sarebbe difficile per chiunque ricreare quell'incidente esatto. Inoltre non posso condividere l'intero file dell'organizzazione che è l'unico che sembra causare questo arresto. Quindi ho applicato solo il gdbtag a questa domanda. Ho dato quella storia in modo che le risposte possano guidarmi su come eseguire il debug di un arresto anomalo di emacs in generale in modo da poter presentare una utile segnalazione di bug di emacs .
Kaushal Modi,

@lawlist Ho riformulato la domanda in modo che sia chiaro che non è specifico per nessun pacchetto.
Kaushal Modi,

Risposte:


15

Il modo più semplice per eseguire il debug di un arresto anomalo di Emacs è avviare Emacs gdb, quindi fare qualsiasi cosa riproduca l'incidente.

Supponendo che stai costruendo i tuoi Emacs dalla fonte, dovresti passare CFLAGS="-O0 -g3"alla ./configuresceneggiatura. Questo fa sì che il compilatore C disattivi le ottimizzazioni (che possono creare confusione durante il debug) e attiva le informazioni di debug massime nell'eseguibile. Corri makeper costruire Emacs.

Quindi, inizia gdbdalla srcdirectory del tuo albero Emacs:

$ cd ~/my-emacs-tree/src
$ gdb ./emacs

Su OSX, ti consigliamo di passare --with-nsallo ./configurescript e avviare gdb su Emacs all'interno dell'applicazione creata:

$ cd ~/my-emacs-tree
$ make install
$ cd src
$ gdb nextstep/Emacs.app/Contents/MacOS/Emacs

Il motivo per iniziare dalla srcdirectory è che esiste un .gdbinitfile che imposta utili definizioni delle funzioni GDB per il debug di Emacs. Se quel file è stato caricato, dovresti vedere qualcosa del genere all'avvio gdb:

DISPLAY = /private/tmp/com.apple.launchd.cNjhIdtUNd/org.macosforge.xquartz:0
TERM = xterm-256color
Breakpoint 1 at 0x1000ca444: file ../../src/emacs.c, line 353.
Breakpoint 2 at 0x1000e7e34: file ../../src/sysdep.c, line 926.

Digitare rper avviare Emacs. È possibile passare argomenti aggiuntivi sulla stessa riga, ad es r --debug-init.

Quindi prova a far arrestare Emacs. Se si arresta in modo anomalo, dovresti vedere una nota a riguardo gdbe verrai di (gdb)nuovo visualizzato al prompt. Se Emacs non si arresta in modo anomalo, ma si blocca, puoi premere C-znel terminale in cui stai correndo gdbper tornare al prompt.

Una volta richiesto, digitare btper ottenere una backtrace. Come bonus, se il .gdbinitfile Emacs è stato caricato correttamente, vedrai un backtrace di Lisp dopo il backtrace di C. Entrambe le tracce sono cose molto utili da includere M-x report-emacs-bug.


Ci sono molte più informazioni, incluso come esaminare lo stato delle variabili ecc., Nel etc/DEBUGfile nella struttura di Emacs. Puoi aprirlo digitando C-h C-dEmacs, oppure puoi leggerlo online .


Grazie. Oggi troverò il tempo per provare la tua soluzione. Sono ancora curioso di emacs-buffer.gdbsapere cosa fa e come usarlo.
Kaushal Modi,

A quanto ho capito, questo è specificamente per recuperare il contenuto del file che stavi modificando quando Emacs si è bloccato. Poiché Emacs si salva automaticamente ogni 30 secondi e ogni 300 tasti premuti, direi che è di utilità limitata.
Legoscia,

1
Ma ciò dovrebbe anche aiutare a ripristinare i buffer non di file, è corretto? La mia idea era di usarlo per vedere cosa avevano * Messaggi * e * Backtrace * appena prima dello schianto.
Kaushal Modi,

Ah, questo è un buon punto. Non l'ho mai usato da solo, quindi non sono sicuro di come farlo.
Legoscia,

Sai come eseguire gdb su emacsclient? Non riesco a trovare quel file binario src/. L'ho trovato lib-src/però ma questo non ha funzionato gdb ./emacsclient -a '' -c. Quindi ho bisogno di aiuto su come passare quelli -ae -cdiscute su emacsclient invece che su gdb.
Kaushal Modi,
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.