凍結したEmacsのデバッグ


48

メールにmewを使用しています。SMTPのメールプロバイダーでTLSを使用する必要があります。ただし、それを呼び出そうとすると、Emacsがフリーズします。

この機会に、Emacsパッケージの詳細を学びたいと思います。この問題をデバッグするにはどうすればよいですか?Common Lispのような、ある種の組み込みデバッガーはありますか?ロギングを使用できますか?


3
どのように「それを呼び出す」のですか?Lispで定義されたEmacsコマンドを使用する場合、(1)コマンドを定義するソースコードをロードし、(2)を使用しM-x debug-on-entry THE-COMMAND、次にを使用してデバッガーをステップ実行しますd(または場合cによってはいくつかのステップをスキップします)。ソースコードを別のフレームで開いたままにしておくと、デバッガーが実行していることを追跡できます。ここに表示される内容を報告するか、Emacsのバグを示唆していると思われる場合は、を使用してくださいM-x report-emacs-bug
ドリュー

回答:


44

に頼る前にgdb、Unix-yオペレーティングシステムを使用している場合は、他の回答に記載されてSIGUSR2いるDEBUGファイルに記載されているように、Emacsプロセスに送信してみてください。

$ kill -SIGUSR2 <emacs_pid_goes_here>

これにより、Emacsは現在のループからLispデバッガーへのブレークを試みます。

または、emacs pidを手動で入力せずにこの1つのライナーを使用します。

$ ps aux | grep -ie emacs | grep -v grep | awk '{print $2}' | xargs kill -SIGUSR2

または、killall利用可能な場合:

$ killall -USR2 emacs

1
2回実行しなければなりませんでした(まあ、再試行する前に1秒以上待つことができました:-)。とにかく、問題(フォントのロック処理が長い行に対して遅すぎる)を特定しました。
ステファンゴーリチョン

font-lockはEmacsをハングアップさせることが知られています-マッチャートリガーがポイントを前方に移動しない場合、永遠に再トリガーします。
リンディダンサー

うわー、それはすごかった。それでも私の問題の原因はわかりませんが、そのトリックは命の恩人です、ありがとう!
マット

3
私のシステムでは、onelinerは「killall -USR2 emacs」に単純化できます(もちろん、複数のEmacsプロセスがある場合は避けてください)。
YoungFrog

1
これにはhtop(en.wikipedia.org/wiki/Htop)をお勧めします。/検索するemacsk、信号を送信します。Macのアクティビティモニターでも実行できます(メニューから:[表示] | [信号をプロセスに送信])。
ラッシー

36

を押したときにフリーズが解消した場合C-gは、組み込みのデバッガーを使用できます。M-x toggle-debug-on-quitメッセージを送信する前に入力し、C-gフリーズしたらヒットし、表示される*Backtrace*バッファーを調べます。

解決C-gしない場合、おそらくCコードでフリーズが発生しているため、などの外部デバッガーを使用する必要がありますgdb。それを行う方法についてのヒントを提供C-h C-dするDEBUGファイルを見るためにヒットします。(EmacsリポジトリーのWebインターフェースでDEBUGファイルを読むこともできます。) この答えgdb、Emacsでの使用方法についての詳細です。


C-g数回ヒットする必要がある場合がありますC-g C-g C-g
ドリュー

@Drew何度か叩く必要があることに気づきました。なぜなのかご存知ですか?
ウィルフレッドヒューズ14年

2
はい。EmacsのマニュアルnodeをQuitting参照してください。どうやって見つけたの?C-h r i、「Cg」と入力してを押しRETます。
ドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.