クラッシュしたEmacsのより良いデバッグ?


9

Emacs(24.3.93.1)は、Finderから起動すると問題なく動作しますが、ターミナルバージョンを起動すると、次のようになります。

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

Emacsは次のようにクラッシュします:

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

問題はinit.elの1行によって引き起こされているようです。

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

その行がコメント化されている場合、Emacsのターミナルバージョンも正常に起動します。

クラッシュの原因を特定するのに数時間かかりました(init.elが半分ずつ減少しました)。

Emacsは、ターミナルアプリで指定されたフォントとフォントサイズを継承します(基本的に、この行はCLIでは意味がありません)。

  1. 一般的に言えば、クラッシュするEmacsをデバッグするより良い方法はありますか?おそらく、より説明的なメッセージを出力するようなある種のcliデバッガーを使用していますか?
  2. その行がcliを介してEmacsをクラッシュさせるのに、Finderから起動したのではないのはなぜですか?

それは本当にcliから起動するのですか?または、問題の原因となっているターミナルバージョンを起動しますか?set-face-attributeにエラーをキャッチしてみてください。(condition-case err(set-face-attribute ...)(error(message "message" Whoops! ")))
nic ferrier

3
バグレポートを提出してください。Emacsは、lispコードが原因でクラッシュすることはありません。しかし、これはあなたが使用している特定のビルドに問題があるかもしれません、それは公式リリースですか?
マラバルバ2014

@ nic-ferrier:init.elに1行しかありませ(condition-case err (set-face-attribute 'default nil :font "Menlo-16") (error (message "Whoops!")))んが、同じエラーメッセージで同じクラッシュが発生します。追加のelisp-originatingメッセージはありません。
gsl 2014

@ malabarba:emacsformacosx.com GNU Emacs 24.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2013-03-13 on bob.porkrind.orgから試しましたが、Emacsはクラッシュしません。したがって、それはそれ以降のバージョンのバグである必要があります。バグレポートを提出します。
gsl 2014

1
@Malabarbaとして示さ:ファイルをバグ報告(すぐに): M-x report-emacs-bug。Emacs開発者は、問題のデバッグを支援するためにできることを案内します。
2014

回答:


6

次回の追跡に役立てるため

これは以前私に起こりました。string-to-intEmacs がクラッシュするという状況があり 、それを特定するのにも何時間もかかりました。
申し訳ありませんが、より適切な回答を提供することはできませんが、EmacsのクラッシュはCコードの奥深くで発生し、そのような問題を追跡するための組み込みツールはありません。

でデバッグgdbできると思いますが、その効果はの熟練度に依存しますgdb

あなたが本当にする必要があるのは

バグレポートを提出する

純粋なelispコード(非バイトコンパイル)がEmacsをクラッシュさせることは決してありません。(何らかの無限ループのために)ハングする可能性があり、Emacsがメモリ不足になる可能性があります。しかし、それ以上のクラッシュはバグです。

M-x report-emacs-bug

思いついたこの最小限に機能する例を、ビルドとシステムの説明とともに提供するだけで、親切な開発者にとって十分な助けになるはずです。


2
gdbを使用するのが唯一の方法です。Emacsに何かを追加して、すべてのC呼び出しを自己キャッチするものにラップすることができますが、それは常にオーバーヘッドになります。Emacsがクラッシュすることは想定されていませんが、クラッシュする場合は、そのバグを特別に処理する必要があります。ええ、壊れている場合は、バグを報告してください。バグがどこにあるのかを絶対に見つけるには、必ずgdbを使用してください。
nicフェリア2014

4

gdbを使用したデバッグのリファレンスとして、ビルドツリーからsrc / temacsを使用する必要があります。これは、デバッガを混乱させる事前ダンプされたelispのないEmacsです。

gdb --args src/temacs -nw

1
すばらしいアドバイスに感謝します(また、周りを見つけるのも簡単ではありません)。ありがとう。
gsl 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.