[Macemacsjp-users 1699] auto-save-buffers 利用時のクラッシュについて

アーカイブの一覧に戻る

Takaaki ISHIKAWA takax****@ieee*****
2011年 8月 30日 (火) 07:35:48 JST


はじめまして,石川と申します.
いつも inline-patch のお世話になっています.

さて,表題の通り,Cocoa Emacs + auto-save-buffers.el における
Emacs.app のクラッシュについて,少々分析しましたので,
ご意見いただければ幸いです.

対象としているのは,最新のemacs-23(emacs-e63f572)
http://git.savannah.gnu.org/gitweb/?p=emacs.git;a=shortlog;h=refs/heads/emacs-23
に,inline-patch(Revision 573)をあてて,当方の環境(OSX 10.7.1)にて
ビルドしたEmacs.appです.Emacs のバージョンは,23.3.50 になります.


== クラッシュの状況 ==

Emacs.app がクラッシュするのは,IME(かわせみ/ことえり)ON時入力中で,
auto-save-buffers が自動的にバッファを保存するタイミングです.

再現性が低かったので,gdb で確認したところ,Fevalが発行するabort();が
Emacs.appを落としているとわかりました.

-------------
(gdb) f 3
#3  0x000000010011b53d in Feval (form=4424034422) at eval.c:2226
2226	    abort ();
-------------

直前で Feval をコールしているのは,nsterm.m の
- (NSRect)firstRectForCharacterRange: (NSRange)theRange
の条件文でした.


== 対処案 ==

条件文が実現しているアルゴリズムをみると Feval を使わなくても
同等の結果が得られそうなので,inline-patch に次のような変更を
加えることで,当方の環境ではクラッシュしなくなりました.
# 処理が遅くなる可能性が少し考えられます.

*** 1073,1081 ****
      if (NS_KEYLOG)
        NSLog (@"firstRectForCharRange request");
  +     
! +   if (NILP (Feval (Fcons (intern ("ns-in-echo-area"), Qnil))))
! +     win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));
! +   else if (WINDOWP (echo_area_window))
  +     win = XWINDOW (echo_area_window);
  +   else
  +     win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));
--- 1073,1079 ----
      if (NS_KEYLOG)
        NSLog (@"firstRectForCharRange request");
  +     
! +   if (WINDOWP (echo_area_window))
  +     win = XWINDOW (echo_area_window);
  +   else
  +     win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));


アルゴリズムの全体を把握していない場当たり的な対処方法ですので,
レビューしていただければ幸いです.


よろしくお願い致します.

----
Takaaki Ishikawa <takax****@ieee*****>




Macemacsjp-users メーリングリストの案内
アーカイブの一覧に戻る