1

Emacs 設定で flymake を有効にしました。ローカルでは問題なく動作しますが、tramp を使用してリモートの html ファイルを開こうとすると、Emacs がハングし、強制終了する必要があります。

gdbで確認してみたところ、スタックのトップは以下の通り。

#0  0x00007fcee786c83c in __pselect (nfds=<optimized out>, readfds=<optimized out>, writefds=<optimized out>, exceptfds=<optimized out>, timeout=<optimized out>, sigmask=<optimized out>)
at ../sysdeps/unix/sysv/linux/pselect.c:79
#1  0x00000000004d02f7 in xg_select (fds_lim=13, rfds=0x7fff4d830210, wfds=0x0, efds=0x0, timeout=0x7fff4d830460, sigmask=0x0) at xgselect.c:48
#2  0x00000000005947f3 in wait_reading_process_output (time_limit=<optimized out>, nsecs=0, read_kbd=0, do_display=false, wait_for_cell=12096626, wait_proc=<optimized out>, just_wait_proc=1) at process.c:4633
#3  0x0000000000597429 in Faccept_process_output (process=56383997, seconds=<optimized out>, millisec=<optimized out>, just_this_one=<optimized out>) at process.c:4026

何らかの理由で、リモート マシン上の xmlstarlet プロセスのようですが、その理由はわかりません。

flymake が使用するコマンドは である必要がありxmlstarlet val filename.html、コマンド ラインから問題なく実行されます。tidy や xmllint などの他のプログラムを使用するように flymake を構成しても、何も変わりません。

問題をデバッグできるようにするために何ができるかについて何か提案はありますか?

編集

実際、しばらくすると (少なくとも 1 分)、コマンドが完了します。起動後、同じバッファを待つ必要がなくなり、flymake は期待どおりに動作します。

システムの詳細

Ubuntu 12.04 マシンから接続しています。FreeBSD 9.3 マシンに接続しようとしましたが、DragonflyBSD マシンでも同じ問題が発生します。リモート シェルは両方のシステムで zsh ですが、bash に変更しても役に立ちません。

スタックトレース

これは私が取得した完全な Lisp スタックトレースです。

https://gist.github.com/mrighele/8371399

これはemacs wikiflymake-html-initで提示されたものです

興味深いことに、シグナルを送信すると、ファイル バッファーの内容が次のように上書きされます。

tramp_perl_file_truename () {
function> \perl5 -e '
function quote> use File::Spec;
function quote> use Cwd "realpath";
function quote> sub recursive {
function quote>     my ($volume, @dirs) = @_;
function quote>     my $real = realpath(File::Spec->catpath(
function quote>                    $volume, File::Spec->catdir(@dirs), ""));
function quote>     if ($real) {
function quote>         my ($vol, $dir) = File::Spec->splitpath($real, 1);
function quote>         return ($vol, File::Spec->splitdir($dir));
function quote>     }
function quote>     else {
function quote>         my $last = pop(@dirs);
function quote>         ($volume, @dirs) = recursive($volume, @dirs);
function quote>         push(@dirs, $last);
function quote>         return ($volume, @dirs);
function quote>     }
function quote> }
function quote> $result = realpath($ARGV[0]);
function quote> if (!$result) {
function quote>     my ($vol, $dir) = File::Spec->splitpath($ARGV[0], 1);
function quote>     ($vol, @dirs) = recursive($vol, File::Spec->splitdir($dir)<sive($vol, File::Spec->splitdir($dir))                                       <sive($vol, File::Spec->splitdir($dir));
function quote>     $result = File::Spec->catpath($vol, File::Spec->catdir(@di<>catpath($vol, File::Spec->catdir(@dir                                       <>catpath($vol, File::Spec->catdir(@dirs), "");
function quote> }
function quote> if ($ARGV[0] =~ /\/$/) {
function quote>     $result = $result . "/";
function quote> }
function quote> print "\"$result\"\n";
function quote> ' "$1" 2>/dev/null
function> } 2>/dev/null; echo tramp_exit_status $?
tramp_exit_status 0
4

1 に答える 1

1

次のことを試してください。

(setq debug-on-event 'sigusr2)

そして、Emacs がフリーズしたらkill -USR2 <emacspid>、シェルから実行します。これにより、問題の追跡に役立つ Lisp レベルのバックトレースが得られるはずです。

于 2013-11-10T20:08:03.690 に答える