Mac + VSCode 環境での PostgreSQL ソースコードデバッグ

Aug 31, 2025

3 min
💬

Mac と VSCode 環境で PostgreSQL のソースコードをデバッグする方法をステップごとに紹介します。ソースのビルドから lldb による Attach デバッグまでの全体の流れを扱います。

1. 概要

PostgreSQL のソースコードデバッグとは、実行中のデータベースサーバープロセスにデバッガをアタッチし、1 つの SQL 文が parser、planner、executor を経て処理される流れをコードレベルで追跡する方法です。Mac 環境ではデフォルトのデバッガが lldb なので、PostgreSQL をデバッグシンボル付きでビルドし、VSCode からバックエンドプロセスに attach する設定がポイントになります。

TIP

この記事を書いている時点で(ベータを除き)17 バージョンまでリリースされているため、本記事では 17 バージョンを基準に説明します。

全体の流れは他の OS(Linux、Windows)と大きくは変わりませんが、Mac では gdb の代わりに lldb(Low Level Debugger、LLVM ベース)を使う必要があるため、一部の設定・コマンドに違いがあります。本記事の手順に沿って進めれば、次のことを自分で行えるようになります。

  • PostgreSQL のソースコードをデバッグモードでビルドし、サーバーを起動する方法
  • VSCode から lldb で PostgreSQL のバックエンドプロセスに Attach する方法
  • breakpoint を設定し、クエリの実行フローをコードレベルで追跡する方法

2. PostgreSQL デバッグ環境の構築

2.1. PostgreSQL ソースコードの取得

PostgreSQL は GitHub に公式ミラーを提供していますが、実際のオリジナルソースは別のリポジトリで管理されています。そのため GitHub ではなく PostgreSQL 自身の Git リポジトリを利用する必要があります。

Bash
git clone https://git.postgresql.org/git/postgresql.git
cd postgresql

clone するとデフォルトの master ブランチになります。特定のバージョンをデバッグしたい場合は、該当ブランチ/コミットに checkout します。

Bash
## 17 버전 STABLE checkout
git checkout REL_17_STABLE && git pull
 
## 특정 마이너 버전 checkout
git checkout REL_17_6

2.2. PostgreSQL のビルド

ビルドに必要なパッケージをインストールします。

Bash
brew install icu4c
brew install pkg-config

PostgreSQL 公式のビルド手順に沿って、ビルド前に configure を実行します。

Bash
PG_VERSION=17
 
./configure \
	--prefix=$HOME/postgres/pg${PG_VERSION} \
	--enable-cassert \
	--enable-debug CFLAGS="-ggdb -O0 -fno-omit-frame-pointer" CPPFLAGS="-g -O0" \
	--with-includes=$(brew --prefix icu4c)/include \
	--with-libraries=$(brew --prefix icu4c)/lib \
	PKG_CONFIG_PATH=$(brew --prefix icu4c)/lib/pkgconfig

オプションの説明:

  • --prefix: PostgreSQL のインストールパス
  • --enable-cassert: 内部の C Assert 文を有効化
  • --enable-debug: デバッグビルドを有効化
  • CFLAGS: -ggdb(デバッグシンボル)、-O0(最適化の無効化)、-fno-omit-frame-pointer(スタックトレースを容易に)
  • CPPFLAGS: -g(デバッグシンボル)
  • --with-includes/--with-libraries: icu4c のヘッダ/ライブラリパス
  • PKG_CONFIG_PATH: pkg-config のライブラリ探索パス

configure が終わると src/Makefile.global が生成されます。意図したオプション(特に -g-O0)が反映されているか確認してください。抜けているとデバッグ中に変数の値が見えない問題が発生します(経験談です)。

Bash
grep -E '^(CFLAGS|CPPFLAGS) = ' src/Makefile.global
Bash
CPPFLAGS = -isysroot $(PG_SYSROOT) -g -O0  -I/opt/homebrew/opt/icu4c@77/include
CFLAGS = -Wall ... -g -ggdb -O0 -fno-omit-frame-pointer

これでビルドします。--prefix で指定した $HOME/postgres/pg17 に成果物が生成されます。

Bash
make && make install

WARNING

ビルドのポイントは、CFLAGSCPPFLAGS-g -O0 を必ず含めることです。抜けているとデバッグ時に変数の値を確認できません。

2.3. PostgreSQL サーバーの起動

initdb で PGDATA(データディレクトリ)を作成します。

Bash
$HOME/postgres/pg17/bin/initdb -D $HOME/postgres/pgdata/pg17

サーバーを起動する前に、$HOME/postgres/pgdata/pg17/postgresql.confportmax_connections などの主要な設定を確認します。それではサーバーを起動して接続します。

Bash
$HOME/postgres/pg17/bin/pg_ctl -D $HOME/postgres/pgdata/pg17 -l $HOME/postgres/pgdata/pg17/logfile start
## waiting for server to start.... done / server started
 
$HOME/postgres/pg17/bin/createdb -p 5432 test
$HOME/postgres/pg17/bin/psql -p 5432 test

NOTE

$HOME/postgres/pg17/bin を毎回指定するのは面倒です。環境変数に登録することもできますが、複数の PostgreSQL バージョンを同時にデバッグするとパスが衝突する可能性があるため、おすすめしません。

3. VSCode デバッグ環境の設定

VS Code のデバッガ設定はプロジェクトごと、またはグローバルに適用できます。本記事はグローバル設定を基準にします。

NOTE

プロジェクトごとに設定する場合は、ソースパスに .vscode/launch.json を作成し、以下の内容を追加します。

  1. Command + Shift + P でコマンドパレットを開きます。
  2. settings.json を検索して Preferences: Open User Settings (JSON) を選択します。

settings.json を開く

  1. settings.json に以下を追加します。
VSCode グローバル launch 設定を見る
JSON
"launch": {
  "version": "0.2.0",
  "configurations": [
    {
      "name": "(lldb) Attach DB - PostgreSQL 17",
      "type": "cppdbg",
      "request": "attach",
      "program": "${env:HOME}/postgres/pg${input:pg_version}/bin/postgres",
      "MIMode": "lldb"
    }
  ],
  "inputs": [
    {
      "id": "pg_version",
      "type": "promptString",
      "description": "Enter the PostgreSQL Version",
      "default": "17"
    }
  ]
}
  1. サーバーに接続したら、SELECT pg_backend_pid(); でプロセスの PID を確認します。
SQL
SELECT pg_backend_pid();
 pg_backend_pid
----------------
          85770
(1 row)
  1. fn + F5 または Run and Debug → (lldb) Attach DB - PostgreSQL 17 でデバッガを実行し、バージョンと pg_backend_pid の値を入力します。

lldb attach の実行

NOTE

VSCode 設定のポイントは、MIModelldb に、requestattach に設定し、実行中の PostgreSQL バックエンドプロセスに接続することです。

4. デバッグテスト

  1. クエリ実行関数 exec_simple_querysrc/backend/tcop/postgres.c で見つけて breakpoint を設定します。

exec_simple_query breakpoint

  1. psql からクエリを実行します。
SQL
CREATE TABLE test(id bigint not null generated by default as identity, name text);
  1. breakpoint が正常にトリガーされることを確認できます。ここからデバッグしながら PostgreSQL の動作原理をコードレベルで学習できます。

breakpoint がトリガーされて停止したデバッグ画面

5. まとめ

ステップポイント
ソースコードの準備PostgreSQL 公式 Git リポジトリから clone し、目的のバージョンを checkout
デバッグビルドconfigure 時に -g -O0 オプションを必ず含める(最適化の無効化)
サーバー起動initdb で PGDATA を作成し、pg_ctl で起動
VSCode 設定lldb · attach モードでバックエンドプロセスの PID に接続
デバッグbreakpoint を設定し、クエリ実行でコードの流れを追跡

TIP

デバッガで PostgreSQL の動作構造をコードレベルで直接追跡しながら、実行の過程を学習できます。

6. 参考文献