Xcode+gdbデバッガでPostgreSQLモジュールをちょっとだけ動かしてみた

前置き

PostgreSQL解読室というサイトを以前やっていて、2年くらい更新が止まっているのですが、もう何ヶ月かしたら再開したいと考えています。

その準備の一環で、XcodePostgreSQLデバッグビルドして、Xcode+gdbデバッガでPostgreSQLのモジュールをちょっとだけ動かしてみました。
Xcodeを使うのは初めてなので、変なところがあったらご容赦を。

また、ここここが参考になりました。感謝。

Xcodeの準備

XcodeiMacを買うと、付属のCDでついてくるが、最新版はADC*1というところからダウンロード可能。
ただし、ユーザー登録が必要。
怪しいところではないと思うので、ユーザー登録した。
今回は、バージョン3.1.3をダウンロードして使用。

ソースコードの準備

任意のディレクトリに、ソースコードを展開して、configureをかける。
(今回はpostgresql-8.3.7を使用しました。*2

$ ls
postgresql-8.3.7.tar.gz
$ tar xf postgresql-8.3.7.tar.gz 
$ ls
postgresql-8.3.7	postgresql-8.3.7.tar.gz
$ cd postgresql-8.3.7
$ ./configure

configureが終わったら、makeできるようになる。
しかし、ここによると、gccに-gオプションをつけないとデバッガのブレークポイントがきかない。
ブレークポイントを使えるようにするためには、Xcodeにも設定が必要だが、それは後にする。
-gオプションをどうつけるかだが、今回は、srcフォルダ直下のMakefile.global内で指定されている変数CCの指定に、-gオプションを加えてみた。

$ cd src
$ pwd
(任意のフォルダ)/postgresql-8.3.7/src
$ ls Makefile.global
Makefile.global
$ cp -p Makefile.global Makefile.global.org
$ vi Makefile.global

変更内容はこんな感じ。

$ diff Makefile.global.org Makefile.global
213c213
< CC = gcc -no-cpp-precomp
    • -
> CC = gcc -g -no-cpp-precomp $

Xcodeプロジェクト作成

今回プロジェクトファイルをソースファイルのディレクトリ内に作ってしまう。
ソースファイルの中に作ってしまって大丈夫なのか心配なので、今までの内容をバックアップしておく。

$ ls
postgresql-8.3.7	postgresql-8.3.7.tar.gz
$ cp -pr postgresql-8.3.7 postgresql-8.3.7_configured
$ ls
postgresql-8.3.7		postgresql-8.3.7.tar.gz		postgresql-8.3.7_configured
$ 

これで何かあっても戻せる。

Xcodeのプロジェクトの作り方は、ここここが参考になる。
Xcodeを起動して、[ファイル]-[新規プロジェクト]を選択。



[Empty Project]を選択して選択ボタンを押す。



ソースファイルのフォルダ名を[名前]に記入して、[保存]をクリックすると、置き換えてもいいですかと聞かれる。



[置き換え]をクリックする。



プロジェクトが作成されたようで、なんかウィンドウが出た。
しかし、置き換えてもいいですかとか聞かれたので、少し不安になる。
もとのソースファイルの構成とか壊してないよね?
確認してみる。

$ ls
postgresql-8.3.7		postgresql-8.3.7.tar.gz		postgresql-8.3.7_configured
$diff -r postgresql-8.3.7_configured postgresql-8.3.7
Only in postgresql-8.3.7: build
Only in postgresql-8.3.7: postgresql-8.3.7.xcodeproj
$ 

よしよし、なんか追加されただけだ。壊してない。

Xcodeでビルドしてみる

ターゲットというのを作ると、ビルドができるようだ。
試しにやってみる。



「ターゲット」をコントロールキー押しながらクリックして、[追加]-[新規ターゲット]を選択。



[External Target]を選択。この辺の手順は参考サイトのほうが詳しい。



ターゲット名を入力。この辺の手順は以下同文。



ウィンドウにターゲットの情報が出てくる。
「カスタムビルドコマンド」の「ディレクトリ」の選択ボタンをクリック。



postgresql-8.3.7を選択して選択ボタンをクリック。



カスタムビルドコマンドの設定ができた。

そろそろ独自性を出してみると、この状態でもうビルドができる。
なのでやってみる。メニューの[ビルド]-[ビルド]を選択する。
左下に、小さく「Running external build tool」と出たら、しばらく待つ。
終了すると、左下に、「ビルドは問題なく完了しました(1個の警告)」と出る。
まあとりあえず警告は気にしない。
春に買った自分のiMacでは、数分で終了。
すげえ。やはり時代は変わった。

Xcode+gdbデバッガを動かしてみる

デバッガを動かすには、環境設定を少しだけ変えておく必要がある。
[Xcode]-[環境設定]を設定して、環境設定画面を開く。



ここで、ネット上の各所に書かれているように、右上の「シンボルを読み込む方法」にチェックが入っていると、ブレークポイントで処理が止まらない。チェックを外しておく。
また、Xcodeを導入したばかりだと、左側の「開始時」の設定が「何もしない」になっている。これはそのままでも動くが、初心者の自分としては、設定を間違えていて動かないときになにも情報がないと不安になるので、「コンソールとデバッガを表示」にしておく。


それでは、試しにちょっとだけ動かしてみる。

どうせちょっとだけなので何でもいい。initdbにしてみる。



左の枠内の「実行可能ファイル」をコントロールキー押しながらクリックして、[追加]-[新規カスタム実行可能ファイル]を選択。



「実行可能ファイル名」と、「実行可能ファイルのパス」をinitdbのものに指定して、「完了」をクリック。



「実行可能ファイル」の下に「initdb」ができて、さらに「実行可能ファイル“initdb”の情報」なるウィンドウが出てくる。出てきたウィンドウは閉じて問題ない。


ではさっそく、initdbをデバッガで動かしてみる。
まず、ブレークポイントを設定してみる。

[ファイル]-[開く]で、initdb.cを選択して開く。



試しにmain()の最初にブレークポイント設定。
参考にしたサイトには、「ブレークポイントごとに場所(Location)を指定してやらないと動かない」と書いてあったけど、自分の環境ではしなくても動いた。
理由は確認してない。ごめん。

すでに実行ファイルは存在するけど、目立つところにボタンがあるので、「ビルドして進行」をクリック。



デバッガとデバッガコンソールが出てくる。
なんか、ブレークポイントとちがうところで処理が止まってるような気がするけど、自分の場合は、とりあえず止まればいいので、今のところ気にしない。

あとがき

MacOSXUNIXベースであることと、Xcodegccgdbを使ってくれることから、gccでビルドするようなオープンソースについてUNIXベースでの挙動を解読するツールとしては、MacOSX + Xcodeは、なかなかいいんじゃないかと思います。
まあできる人はEclipseとかでやってるのかもしれませんが、自分には難しそうだったので、手が出ませんでした。
XcodeMacOSXに付属というのも、いろいろな意味でメリットだと思います。
これでブレークポイント関係がもっと安定してくれたら言うことないです。