metacity 等 WindowManager のデバッグ

昨日の作業だけど、忘れないように書いておきます。

metacity をデバッグするには、debugオプション付きでビルドしたものを gdb 等でデバッグする必要がある。しかし、metacity のような WindowManager は gdb から起動することはできないので、

$ gdb --pid=PID

といった感じで、起動後に process ID を指定してデバッグします。 gdb 起動後は、 breakpoint を指定して continue します。

しかし、 breakpoint を指定するとそこで process が停止するので、下手な breakpoint を設定するとデッドロックのような状態になり、デバッグできません。

こうなったときは、 Xephyr を使って、子 gdm を起動します。こうすることで、metacity などの WindowManager が二重に起動した状態になりますが、親の metacity 上の terminal 等で 子の metacity をデバッグすることが可能になります。

$ ps ax | grep metacity

して数字の大きいものが子の metacity の process です。子の process ID を指定して、 gdb を起動すればデバッグができます。

残念ながら、今回はデバッグ中は不具合が発生しないという現象だったので、対応できませんでしたが。。。