emacsクラッシュをデバッグするにはどうすればよいですか?


16

パッケージ1の関数を使用するとemacsがクラッシュする理由をデバッグしています。このデバッグプロセスの目的は、を使用して送信する有用なデータを取得することですM-x report-emacs-bug

emacsのクラッシュをデバッグする方法についてのヘルプを得るために、Emacs Manual-CrashingおよびEmacs Manual-After a Crashを既に見てきましたが、彼らは助けませんでした。

Aクラッシュ後のマニュアルは、を意味しemacs-buffer.gdbますが、私はそれを使用する方法が分かりません。Googleに助けを求めている間に、このemacs.SEの質問に出会い-ggdb3フラグを使用してemacsを再コンパイルしました。

私は以前に使用gdbした経験がないため、emacs-buffer.gbdファイルを使用しようとして失敗したことはほとんどありませんでした。

ここに私が試したものがあります:

  • 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

ちなみに、-ggdb3フラグ付きでコンパイルされたemacsのロードには約10秒かかります。以前は5〜6秒でしたが、現在は約16〜17秒です。私の初期化でそれを計算するコードのために、正確な秒を知っています。この起動時間の増加は予想されますか?


脚注1:undo-tree特定の.orgファイルの取り消し履歴を復元しようとすると、emacsは一貫してクラッシュします(これを公開することはできません)。持ってい(setq undo-tree-auto-save-history t)ます。このクラッシュはemacs git masterでのみ発生し、emacs 24.5では発生しません。emacs 24.5では、undo-tree(元に戻す履歴ファイルが存在する場合でも)元に戻す履歴を読み込めないことを示すエラーがスローされますが、少なくともそのバージョンではemacsセッションはクラッシュしません。


2
私は、Emacsを使用してに二年以上だと、まだ実際にそれを考え出したていない: stackoverflow.com/q/20891431/2112489は 、正直に言うと、それはやや謎のだと行う方法を教えて権威のスレッドがあるはずですそれ。
法律家

さて、質問は視聴回数を取得することですが、賛成票はありません。質問を改善する必要がある場合はお知らせください。質問が良い答えを生み出し、emacsコミュニティに役立つと思われる場合は、回答者候補の注目を集めるように、それを支持してください。
カウ

あなたのスレッドをハイジャックしたくありませんが、提案をします。スレッドが適切な時間内に適切な回答を引き付けない場合(つまり、その意味を決めるのであれば)、このスレッドをより一般的なものにする価値があるかもしれません。クラッシュした場合は、Emacs開発チームの指導者が上記の情報を含むバグレポートを受け取ったときに問題を診断/トラブルシューティングするのに役立つ意味のあるバックトレースを作成します。私は問題がundue-tree問題のために重要であることを理解していますが、より広い可能性を持っています。
法律家

@lawlistそれはまさにこのスレッドが期待するものです。undo-tree他の誰かがその正確なクラッシュを再現することは難しいとわかっているので、特定の回答は期待していませんでした。また、このクラッシュを引き起こすと思われる唯一の組織ファイル全体を共有することはできません。そのgdbため、この質問にはタグのみを適用しました。その答えを参考にして、一般的なemacsクラッシュのデバッグ方法を教えて、有用なemacsバグレポートを提出できるようにしました
カウシャルモディ

@lawlist質問を言い換えて、どのパッケージにも固有のものではないことを明確にしました。
カウシャルモディ

回答:


15

Emacsクラッシュをデバッグする最も簡単な方法は、でEmacsを起動しgdb、クラッシュを再現することをすることです。

ソースからEmacsを構築していると仮定するとCFLAGS="-O0 -g3"./configureスクリプトに渡す必要があります。これにより、Cコンパイラは最適化(デバッグ中に混乱を招く可能性があります)をオフにし、実行可能ファイルのデバッグ情報を最大限にアクティブにします。実行makeしてEmacsをビルドします。

次に、Emacsツリーのディレクトリgdb内から開始しますsrc

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

OSXでは--with-ns./configureスクリプトに渡して、作成されたアプリケーション内のEmacsでgdbを起動します。

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

srcディレクトリから起動する理由は、.gdbinitEmacsのデバッグに役立つGDB関数定義を設定するファイルがあるためです。そのファイルがロードされている場合、起動時に次のようなものが表示されるはずです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.

入力rしてEmacsを起動します。同じ行に追加の引数を渡すことができます(例:)r --debug-init

次に、Emacsをクラッシュさせます。クラッシュした場合は、それについてのメモが表示されgdb(gdb)再びプロンプトが表示されます。EmacsがクラッシュせずにフリーズするC-z場合は、実行中のターミナルでヒットgdbしてプロンプトに戻ることができます。

プロンプトが表示されたら、入力btしてバックトレースを取得します。おまけとして、Emacs .gdbinitファイルが正しくロードされた場合、Cバックトレースの後にLispバックトレースが表示されます。両方のバックトレースは、に含めるのに非常に便利ですM-x report-emacs-bug


etc/DEBUGEmacsツリーのファイルには、変数の状態などを調べる方法など、さらに多くの情報があります。C-h C-dEmacsに入力して開くか、オンラインで読むことができます


ありがとう。今日はあなたのソリューションを試す時間を見つけます。私はまだ何emacs-buffer.gdbをどのように使用するのか興味があります。
カウシャルモディ

私が理解しているように、それは特にEmacsがクラッシュしたときに編集していたファイルの内容を回復することです。Emacsは30秒ごと、300キーを押すたびに自動保存されるため、これは限られた用途にしか使用できません。
レゴシア

1
しかし、それは非ファイルバッファの回復にも役立つはずです、それは正しいですか?私のアイデアは、それを使用して、クラッシュの直前に* Messages *と* Backtrace *が持っていたものを確認することでした。
カウシャルモディ

ああ、それは良い点です。自分で使ったことがないので、どうやってやるかわからない。
レゴシア

emacsclientでgdbを実行する方法を知っていますか?私はそのバイナリを見つけることができませんsrc/。私はそれを見つけましたlib-src/が、これはうまくいきませんでしたgdb ./emacsclient -a '' -c。そのため、gdbではなくemacsclientにこれら-a-c引数を渡す方法についてのヘルプが必要です。
カウシャルモディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.