gdb で vim をデバッグする
vim + screen + gdbでデバッグしよう
http://d.hatena.ne.jp/parasporospa/20060827
のつづき。
結局、gdb で vim を起動するときは
$ gdb --args vim -f -g (gdb) run
とすると普通にデバッグできる。vim を起動してからプロセスIDを指定してアタッチするより、こちらの方が速い。
さて、Windows の OutputDebugString 相当のことをしたい。
vim の中で普通に fprintf(stderr, ...) すると、gdb の出力と混ざってしまう。
できればこれを別にしたい。
run コマンドでデバッギの標準エラー出力をリダイレクトしてみた。
(gdb) run 2>hoge.log
すると gvim でなくコンソール上で vim が立ち上がってしまう。
最初に --args で指定した引数が無視されるようだ。
(gdb) run -f -g 2>hoge.log
としたら gvim が立ち上がった。
別の kterm を開いてその疑似端末(/dev/ttyp3 など)にリダイレクトすれば、立派な(?)デバッグログウィンドウになる。
vim の実行中に gdb に対して C-c で SIGINT を送ると vim がサスペンドし、gdb に制御が戻る。
以上をまとめて、こんなスクリプトができた。
#!/bin/bash # kterm (ログウィンドウ) を開き、疑似端末デバイス名をファイルに保存 kterm -geometry 70x13+0+500 -T "Debug Output" -e sh -c 'tty > debugout.tty;cat' & ktermpid=$! # debugout.tty ができるまで待つ while [ ! -f debugout.tty ]; do sleep 1 done debugout=`cat debugout.tty` rm -f debugout.tty # gdb を起動。そして runcmd を実行させる。 echo "run -f -g 2> $debugout " >| runcmd # SIGINT が来たら gdb に渡す trap "pkill -2 gdb" 2 gdb -x runcmd --args ./vim # 後始末 kill $ktermpid 2> /dev/null rm -f runcmd
まだ問題はあるかもしれない。
ついでに .gvimrc で
winpos 0 0 winsize 65 24
などとして gvim のウィンドウ位置・サイズを固定しておくとやりやすい。