2013年1月8日火曜日

[vim] なんかvimがセグメンテーションフォルト吐いたんですけど。。

この記事はVim Advent Calendar 2012の39日目の記事です。
昨日は, @bool_fool さんの、「はじめてVimプラグインを書いた話」でした。

背景


いぜん、こんなのをやってみた。
[vim] 別のファイル開いた時、Ctrl+tで元のファイルに戻れたら便利だと思う

その時の心境はこんな感じ↓

① ctag使ってジャンプした後、元のファイルにCtrl+tで戻るの便利すぎて、ウケるw
② 別のファイル見たいけど、もう画面分割するには小さすぎるから、上に開いてしまう
③ 元、見てたファイルを見たくなる
④ 癖でCtrl+tって押したけど、「E73: タグスタックが空です」って出て、イラっとする
⑤ バッファから探そうとするけど、いっぱい開いて合って、ファイル名思い出すのもめんどくさい
⑥ ファイル開いたあと、Ctrl+tで、元開いてたファイルに戻れたらいいのにとおもう。

どうやったかは、上の記事みてください。。
すごくあれな方法だってるのはわかってます。わかってます。
でも方法が見つからなかったんです。。

まぁ、できるようになったし、いいかなって思ってたけど、その後、問題が発覚。
タグジャンプ、戻る、タグジャンプ、戻るを何度も繰り返していると、
「Vim: 致命的シグナル SEGV を検知しました449C セグメンテーション違反です」と出てしまう。。
途中で落ちるとかマジかんべん。でもこの機能あったらほんとに便利だし使いたい。。

ということで今回は、なぜこのような現象が起きるのか、調べて見ることにした。
この記事、どうしても中途半端に終わる気しかしない。

現象の再確認



とりあえず、どんな現象が起きているかを再確認する。
何度も繰り返していると、いかの2パターンがあることがわかった。

① セグメンテーションフォルト


「Vim: 致命的シグナル SEGV を検知しました」と言われる。

② 致命的なシグナル。


「Vim: 致命的シグナル ABRT を検知しました」と言われ、
「b771b000-b7736000 r-xp 00000000 08:01 193426 /lib/ld-2.11.3.so」とか、
「b7717000-b7718000 rw-p 00003000 08:01 1599098 /usr/lib/gconv/EUC-JP.so」とかが、
いっぱい吐かれて、ターミナルから操作不能になる。

どっちの現象が起きるかに規則性は確認できない。


どんな操作をした時に発生するかもまとめる。

① 2つのファイル間で、Ctrl+]、Ctrl+tを繰り返し続けた時、発生する。
② Ctrl+]でファイルをさかのぼり続けたときも、発生する。
③ ファイルを開き続けて、Ctrl+tで戻り続けても、発生しない。
④ ファイルひらいて、Ctrl+]でジャンプして、を繰り返すと発生。発生するタイミングは不定期。

Ctrl+]がきっかけとなっている模様。

原因を突き止める方法を探す



① gdb でデバッグ。


ここでやってるみたいに、gdbを使ってデバッグ出来ないものかな?。
gdb を用いたデバッグ方法

vimを開いて、そのpsをattachしてみたが、attatchすると「Cannot access memory at address 0x8508428f」と言われ、開いているvimは操作できなくなる。
gdbについて、何か根本的に勘違いしてるのかな。。

② 各操作で、タグスタックの中身がどうなっているか見てみる。



記事の設定をしなかった場合。

【Ctrl+]でタグジャンプ】
1 1 BaseActivityLog 17 lib/model/ActivityLog.php

【Ctrl+tで戻る】
1 1 BaseActivityLog 17 class ActivityLog extends BaseActivityLog {

【Ctrol+]でもう一度タグジャンプ】
1 1 BaseActivityLog 17 lib/model/ActivityLog.php
2 1 Persistent 10 ./lib/model/om/BaseActivityLog.php

【ファイルオープン】
なし

記事の設定をした場合。

【Ctrl+]でタグジャンプ】
1 1 tag_for_add_tagstack 17 lib/model/ActivityLog.php

【Ctrl+tで戻る】
1 1 tag_for_add_tagstack 17 lib/model/ActivityLog.php
2 1 tag_for_add_tagstack 10 ./lib/model/om/BaseActivityLog.php

【Ctrol+]でもう一度タグジャンプ】
1 1 tag_for_add_tagstack 17 lib/model/ActivityLog.php
2 1 tag_for_add_tagstack 10 ./lib/model/om/BaseActivityLog.php

【ファイルオープン】
1 1 tag_for_add_tagstack 2 lib/model/ActivityLog.php

違いといえば、「Ctrl+tで戻った時の中身」と「タグが全部同じになっている」ことの2つか。

結論


だめだ。よくわからん。タイムアップ・・・。

結局、なにも解決せずに、この記事を締めくくることに、痛惜の念を禁じ得ない。
そして、絶対もっといい方法あるはずなんだ。

明日は、@c0hamaさんです。

2 件のコメント:

  1. こんちにわ。
    できればgdbのスタックトレースが欲しいのですが。

    gdb /path/to/your/vim

    したあと、 run を実行して再現させ、その時に bt を実行してもらえると助かります。

    返信削除
  2. こんにちは.

    gtags + vim では,seg fault になったことはないですねぇ.gtags は php もサポートしているようですので,試してみると良いかもしれません.

    返信削除