Bir emacs kilitlenmesinde nasıl hata ayıklayabilirim?


17

Neden bir paket 1 bir işlev kullanırken emacs çöküyor hata ayıklama . Bu hata ayıklama işleminin amacı, kullanarak göndermek için yararlı veriler elde etmektir M-x report-emacs-bug.

Emacs çökmelerinde hata ayıklama konusunda yardım almak için Emacs Manual - Crashing and Emacs Manual - Bir Crash'den sonra baktım , ancak yardım etmediler.

Sonra bir kilitlenme manuel ifade eder emacs-buffer.gdbama bunu nasıl kullanılacağını bilmiyorsunuz. Google'dan yardım isterken, bu emacs.SE sorusuna rastladım ve emacs'ı-ggdb3 bayrakları kullanarak yeniden derledim .

Kullanmak için önceden bir deneyimim yok gdbve bu yüzden emacs-buffer.gbddosyayı kullanmak için birkaç başarısız denemeyi denedim .

İşte denedim:

  • 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

Yan notta, -ggdb3bayrakla derlenen emac'lerin yüklenmesi yaklaşık 10 saniye daha uzun sürer; daha önce 5-6 saniye, şimdi yaklaşık 16-17 saniye idi. Benim init içinde hesaplayan bir kod nedeniyle kesin saniye biliyorum. Başlangıç ​​zamanında bu artış bekleniyor mu?


Dipnot 1: undo-treebelirli bir .org dosyası için geri alma geçmişini geri yüklemeye çalıştığında emacs sürekli olarak kilitleniyor (bu da herkese açık olarak paylaşamıyorum). Bende var (setq undo-tree-auto-save-history t). Bu çökme emacs 24.5'te değil, sadece emacs git master'da gerçekleşir. Emacs 24.5'te, undo-treegeri alma geçmişini yükleyemediğini (geri alma geçmişi dosyası olsa bile) belirten bir hata atar, ancak en azından emacs oturumu bu sürümde çökmez.


2
Emacs'ı kullanmak için iki yıldan fazla bir süredir var ve hala gerçekten çözemedim: stackoverflow.com/q/20891431/2112489 Dürüst olmak gerekirse, biraz gizem ve nasıl yapılacağını öğreten yetkili bir iş parçacığı olmalı o.
hukukçu

Pekala, soru görüntüleme sayıları almak, ancak oy yok. Soruyu geliştirmem için bana ihtiyacınız varsa bildirin. Sorunun iyi bir cevap verebileceğini ve emacs topluluğuna yardımcı olabileceğini düşünüyorsanız, lütfen olası bir yanıtlayıcının dikkatini çekmesi için soruyu kaldırın.
Kaushal Modi

İpliğinizi kaçırmak istemiyorum, ama bir öneride bulunacağım. Eğer iş parçacığı makul bir süre içinde uygun bir cevap almazsa (yani bunun ne anlama geldiğine siz karar verirsiniz), bu iş parçacığını daha genel hale getirmek faydalı olabilir - örneğin, Emacs hatalarını ayıklamak için gdb'nin nasıl kullanılacağına dair çöküyorsa, Emacs geliştirme ekibindeki gurulara, söz konusu bilgileri içeren bir hata raporu alırken sorunları teşhis etmesine / gidermesine yardımcı olacak anlamlı geri çekimler oluşturun. Sorunun undue-treesorunlar nedeniyle önemli olduğunu anlıyorum , ancak daha geniş bir potansiyele sahip .
kanun listesi

@lawlist Bu iş parçacığının olmasını beklediğim şey tam olarak bu. Özel bir undo-treecevap beklemiyordum, çünkü başkalarının kesin çöküşü yeniden yaratmasının zor olacağını biliyorum. Ayrıca bu çökmeye neden gibi görünen tek olan tüm org dosyasını paylaşamıyorum. Bu yüzden gdbbu soruya sadece etiketi uyguladım . Bu arka hikayeyi verdim, böylece cevaplar bana genel olarak bir emacs çökmesini nasıl ayıklayacağımı yönlendirebilir, böylece yararlı bir emacs hata raporu gönderebilirim .
Kaushal Modi

@lawlist Soruyu herhangi bir pakete özgü olmadığı açık bir şekilde yeniden ifade ettim.
Kaushal Modi

Yanıtlar:


15

Bir Emacs çökmesini hata ayıklamanın en kolay yolu, Emacs'ı başlatmak gdbve ardından çökmeyi yeniden üreten her şeyi yapmaktır.

Emac'larınızı kaynaktan oluşturduğunuzu varsayarsak CFLAGS="-O0 -g3", ./configuresenaryoya geçmelisiniz . Bu, C derleyicisinin optimizasyonları kapatmasını sağlar (hata ayıklama sırasında işleri karıştırabilir) ve yürütülebilir dosyada maksimum hata ayıklama bilgilerini etkinleştirir. makeEmacs oluşturmak için çalıştırın .

Ardından, başlangıç gdbiçinden srcsizin Emacs ağacının dizinine:

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

OSX üzerinde, geçmek isteyeceksiniz --with-nsiçin ./configurekomut dosyası ve oluşturulan uygulama içinde Emacs gdb başlatın:

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

Dizinden başlamanın nedeni, Emacs hata ayıklaması için yararlı GDB işlev tanımları ayarlayan srcbir .gdbinitdosya olmasıdır. Bu dosya yüklendiyse, başlatırken gdbşöyle bir şey görmelisiniz :

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.

Tip rEmacs başlatın. Aynı satıra fazladan argümanlar iletebilirsiniz, ör.r --debug-init .

Ardından Emacs'ı çökertmeye çalışın. Eğer çökerse, onunla ilgili bir not görmelisiniz gdbve (gdb)tekrar istemde kalacaksınız . Emacs çökmez ancak donarsa, C-zçalıştığınız terminale vurabilirsiniz .gdb geri dönmek için .

İstendiğinde, btgeri izleme almak için yazın . Bonus olarak, Emacs .gdbinitdosyası doğru şekilde yüklendiyse, C geri izinden sonra bir Lisp geri izlemesi görürsünüz. Her iki geri çekilme de dahil edilmesi gereken çok faydalı şeyler M-x report-emacs-bug.


etc/DEBUGEmacs ağacındaki dosyada , değişkenlerin durumunun nasıl inceleneceği vb. Dahil çok daha fazla bilgi vardır . Emacs'ın C-h C-diçine yazarak açabilir veya çevrimiçi okuyabilirsiniz .


Teşekkürler. Bugün çözümünüzü denemek için zaman bulacağım. Hala ne yaptığını emacs-buffer.gdbve nasıl kullanacağını merak ediyorum .
Kaushal Modi

Anladığım kadarıyla, bu özellikle Emacs çöktüğünde düzenlediğiniz dosyanın içeriğini kurtarmaktır. Emacs her 30 saniyede bir otomatik kaydederken ve her 300 tuşa basışta bunun sınırlı bir kullanım olduğunu söyleyebilirim.
legoscia

1
Ancak bu, dosya olmayan arabelleklerin kurtarılmasına da yardımcı olmalıdır, doğru mu? Benim fikrim bunu * Mesajlar * ve * Backtrace * çökmeden hemen önce ne görmek için kullanmak oldu.
Kaushal Modi

Ah, bu iyi bir nokta. Hiç kullanmadım, bu yüzden nasıl yapacağımdan emin değilim.
legoscia

Gdb'yi emacsclient üzerinde nasıl çalıştıracağınızı biliyor musunuz? Şu ikili dosyayı bulamıyorum src/. lib-src/Gerçi buldum ama bu işe yaramadı gdb ./emacsclient -a '' -c. Bu yüzden nasıl gdb yerine emacsclient geçmek -ave -cargs için yardıma ihtiyacım var .
Kaushal Modi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.