C#flymakeモジュール内のemaceselispでCPUスピンが発生しています。(Flymakeは、定期的にビルドを実行し、現在のバッファー内の構文エラーまたは警告を強調表示するemacsのモジュールです。)
スピンが発生する可能性のあるスポットを探すために、コードに足を踏み入れようとしています。
私がそれにいる間、誰かがスピンを理解するための提案がありますか?emacsに実行を停止して、どこで停止したかを確認できるものはありますか?
M-x set-variable
に設定debug-on-quit
するために使用しt
ます。次に、問題が発生したときにヒットC-gすると、デバッガーは停止したときに実行されていたもののバックトレースを提供します。
Flymakeは、flymake-modeが有効になっているバッファーごとに1秒のタイマーを設定して、バッファーが2flymake-no-changes-timeout
秒以上前に変更されているかどうかを確認します。
flymakeモードで多くのバッファー(数百)を開いている場合、これは驚くほど大量のCPUをむさぼり食う可能性があります。これを修正する単一のグローバルタイマーを備えた、パッチを適用したバージョンのflymakeと、その他のいくつかの問題があります。 :https ://github.com/illusori/emacs-flymake
これはあなたにとって同じ問題ではないかもしれませんが、私にとっては、600ファイルを開いた状態でデスクトップモードで開くとEmacsがロックされ、15分ごとに1回のキー押下が処理されるのは幸運です。
OS XIでも同様の問題が発生し、新しいファイルを開くときにflymakeがemacsをハングさせていました(開いているバッファーが少ない場合でも)。GUI全体がロックされたため、有効にしても効果debug-on-quit
はありませんでした。
gdbをemacsにアタッチすると、次のようになります。
$ gdb -p `psgrep emacs`
(gdb) bt
#0 0x00007fff98954e42 in __semwait_signal ()
#1 0x00007fff8e5d1dea in nanosleep ()
#2 0x00007fff99e3af05 in +[NSThread sleepUntilDate:] ()
#3 0x000000010015d917 in -[EmacsDialogPanel runDialogAt:] ()
#4 0x000000010015fa1f in ns_popup_dialog ()
[...]
そのため、ロックアップは、「実行中に構成エラーが発生しました...」などのダイアログメッセージが原因で発生しました。
問題を説明するこの投稿から、次のようにしてこれらのポップアップメッセージを無効にすることができます。
ただし、Emacsがハングする場合があります。OS Xの赤/黄/青の閉じる/最小化/ズームボタンは、Emacsがフォーカスを失ったかのように灰色に変わりますが、実際にはアクティブなアプリケーションです。タスクを切り替えてEmacsに戻しても、回復しません。Command-Qで終了することはできません。
最終的にあきらめてそれを殺して再起動すると、作業とシェルが失われ、最近のファイルのリストが保存されません。
(setq flymake-gui-warnings-enabled nil)
これにより、flymakeが自動的にオフになっていることを警告するのを防ぎますが、他の方法よりも優れています。
flymake-display-warningはEmacの「message-box」関数を呼び出すため、同じ問題を引き起こす他のツールが存在する可能性があります。
ジェネリック変数use-dialog-boxもありますが、デフォルトのtからnilに設定しても、flymakeでは役に立ちませんでした。defadviceを使用してy-or-no-pとyes-or-no-pをuse-dialog-boxをnilに設定するようにインターウェブに提案することもありますが、これもフライメイクには役立ちません。それらの関数を使用します。