FUSE におけるデバッグ手法 (OSX FUSE編)
OSX FUSE を利用していてデバッグに困った。
今回の実装では FUSE をダウンロードした example というディレクトリに入っている hello.c というプログラムを変更しながら実装をしているのだが、デバッグが難しい。
というのも、main 関数で呼ばれている fuse_main 関数がコールされるとプログラムがデーモン化してしまい、いくらプログラム内で printf なり std::cout なりしても標準出力には何も表示されない。
デーモン化しないように FUSE が提供しているローレベル API を利用してプログラミングするという手もある。これは hello_ll.c として example にプログラムがあるが、そこまでして複雑なことをする必要はないので却下。
うむむ。このままでは得意技である printf デバッグ(笑)が出来ないではないか・・・
無論デバッガ (gdb とか lldb とか)を使えって言うのは分かるんだけれども、どうもうまく動いてくれない・・・とりあえず printf 系だけでも出来れば何とかなるのにな・・・ということで、syslog を利用してデバッグできるように DPRINTF という関数を作成した。
syslog.h でなく標準エラー出力に出したい場合を考慮して #define SYSLOG_ENABLE と定義した場合のみ、syslog 関数を利用しそれ以外は fprintf 関数を利用する仕組みとなっている。
これを利用するとデバッグ情報が /var/log/system.log に出力される。常に system.log を開いたままコンソールに表示しっぱなしにできると便利。これは tail コマンドを利用すると可能。
# tail -f /var/log/system.log
この -f オプションにより、新たに生成されたログがどんどん表示される。
これでひとまず簡易的なデバッグは出来るようになった。この関数はいろいろな場面で利用できそうだ。