PostgreSQLを少し触る機会があり,ソースも少し追っかけてみたい(が膨大で難しい。。)と思いデバッグ環境を構築することに。
ターミナルでgdbでステップ実行するのもあまり慣れていないので,Xcodeでと試した時のメモです。
環境
- MacOS X 10.11.6
- Xcode8.2.1
- postgresql-9.5.5
作成手順
ソースコードジャンプ
まず適当に空のプロジェクトを作ります。
続いてソースコードなどをインデクシングしてジャンプできるようにダミーのターゲットを作成します。
続いてダミーのターゲットのCompile Sourcesでpostgresqlのsrcフォルダ下の.cファイルを追加します。Add Otherで,FinderのSearchに.cと打つとCソース一式を絞り込めます。(他に良い方法あれば教えて欲しいです。。)
すべてのソースを選択してxcodeのCompile Sourcesに表示されるまで少し時間がかかるかもしれません。
続いて,PROJECTのBuild Settingsで「User Header Search Paths」にpostgresqlのsrc/includeディレクトリを指定します。
これでソースにジャンプできるようになっているはず。
ステップ実行
続いてブレークポイントを貼ってステップ実行するための設定。
まず,TARGETSを追加してExternal Build Systemを選択します。
続いて実行ディレクトリを指定します。
次にEdit SchemeでPre-actions,Post-actionsのスクリプトを指定します。Pre-actionsではconfigure
の実行,Post-actionsではmake install
を実行しています。
あとはターゲットを実行します。上手くいくとprefixで指定したディレクトリに実行ファイル等一式が生成されているはずです。
続いて試しにinitdbを実行してみます。まずは,ターゲットを作ります。
続いてEdit Schemeでデバッグビルドした実行ファイルを選択します。
実行時の引数や環境変数を設定します。
以上を設定の上,ブレークポイントを適当な場所に貼ってターゲットinitdbを実行してみます。
指定した箇所でブレークできました!上手くいったようです。
プロセスにアタッチ
psqlで対話インターフェースを起動し,クエリを実行するところでブレークしてステップ実行してみます。
まずは,コンソールでpsqlを実行します。
続いてXcodeからプロセスにアタッチします。プロセスIDはpostgresで最新のプロセス番号になっていると思いますが,psでも確認しておきます。
以下のようなプロセスが見つかると思います。
1 |
78220 ?? Ss 0:00.00 postgres: USER postgres [local] idle |
IDが分かればXcodeでアタッチしてみます。
何も起こったように見えませんが,ポーズボタンを押してプログラムの実行を中断してみます。
するとデバッグコンソールに(lldb)と表示され入力待ち画面になります。
ここで,試しに関数exec_simple_queryにブレックポイントを貼ってpsqlを立ち上げたコンソールからselect 1;
を実行してみます。
lldbからブレークポイントを張る場合は,以下のように入力します。
1 |
(lldb) b exec_simple_query |
一応ブレークポイントを確認してみます。
1 |
(lldb) breakpoint list |
これでselect 1;
を実行すると,以下のようにブレークポイントで中断できました。
コメント