言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Gtk のソースを追いかける準備メモ。

linux のデバッガを使って Gtk+-2 と glib のソースを追いかけます。普通にデバッガを使っても普通はライブラリの中まで入っていけ無いので、ちょっと工夫します。

  • 最初からインストールされているのと同じバージョンのソースを使う。
  • デバッグオプション付きでコンパイルする。
  • テスト用プログラム実行時に、LD_LIBRARY_PATH 環境変数をセットする。
$ cd ~/src
$ wget http://ftp.gnome.org/pub/gnome/sources/gtk+/2.10/gtk+-2.10.14.tar.bz2
$ tar xvf gtk+-2.10.14.tar.bz2
$ cd gtk+-2.10.14
$ ./configure --prefix=/home/takashi
$ make CFLAGS="-g -O0"
$ make install

$ cd ..
$ http://ftp.gnome.org/pub/gnome/sources/glib/2.12/glib-2.12.13.tar.bz2
$ tar xvf glib-2.12.13.tar.bz2
$ cd glib-2.12.13.tar.bz2
$ make CFLAGS="-g -O0"
$ make install

$ cd テストプログラム置き場
$ export LD_LIBRARY_PATH=/home/takashi/lib # インストール先
$ ldd hello # ちゃんとリンクされるか確認

実際にソースを読むのは emacs の M-x gdb を使いました。環境変数を設定し、etags でタグをつけると大変快適です。さらに M-x gdb-many-windows や M-x gud-watch を使うと、まるでスクイークデバッグしているような気分です。最近の進化は素晴らしい。

(shell-command "find ~/src/gtk+-2.10.14/gtk -name '*.[chCH]' -print | etags -o ~/src/gtk+-2.10.14/TAGS -")
(shell-command "find ~/src/glib-2.12.13 -name '*.[chCH]' -print | etags -o ~/src/glib-2.12.13/TAGS -")
(setq tags-table-list '("~/src/gtk+-2.10.14/TAGS" "~/src/glib-2.12.13/TAGS"))
(setenv "LD_LIBRARY_PATH" "/home/takashi/lib")

メモ

  • C-s: gud-step (関数の中に入る) C-n: gud-next (同じ関数の次へ進む)
  • M-x gdb-many-windows (かっこいい画面モード)
  • M-x gud-watch (カーソル位置の変数を調べる)

$ export PKG_CONFIG_PATH=~/lib/pkgconfig