gdb

先日のような、リモートログイン先でデバッグ、みたいな状況なんかのためにgdbの使いかたを少し勉強。今まではprintfデバッグか、VCのデバッガ使うかで済ましてきたのだった。

gdbの使いかたはここらへんを参考に
http://bichir.cocolog-nifty.com/blog/gdb_faq/index.html
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-5.0/gdb-ja_toc.html

共有オブジェクト化されてる部分もデバッガで追えるか、というのが心配だったんだけど、ちゃんと追えるようだ。
豆腐を最適化無し、-gでビルドし、gdbから起動。ブレイクポイント仕掛け、ステップ実行したり、ユニットのステータスを覗いたり書き換えたりして遊んでみる。動的に関数を呼ぶこともできて面白い。ユニットに制御が行ったところで止めて、p getPos() set $1.v[0]=1000 p setPos($1)とかで無理矢理位置を変えたりできる(移動は実はかなり複雑な処理なので、単純に位置の数値を書き換えるだけではダメ。setPos()を介さないといけない)。どうでもいいけど、ユニットなんかはテンプレートクラスの継承を15回くらい重ねてるからシンボル名が凄いことになっている。
…なんかデバッグとは関係ないことばっかりやってた気がするけど、ブレイクポイント設定、ステップ実行、変数監視だけでもprintfデバッグよりは遥かに効率のいいデバッグができるようになった、はず。