gdb で vim をデバッグする

vim + screen + gdbデバッグしよう
http://d.hatena.ne.jp/parasporospa/20060827
のつづき。
結局、gdbvim を起動するときは

$ 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 のウィンドウ位置・サイズを固定しておくとやりやすい。