問題1:ユーザーIDの不一致
行間を読むと、postgres
として実行されているPostgreSQLインスタンスをデバッグしようとしているようです。 ユーザー、またはとにかくあなた自身とは異なるユーザーID。したがって、sudo
を使用しようとすると 。
特にEclipseのようなIDEを使用している場合、これは苦痛です。プレーンなgdb
を使用 sudo
するだけです 目的のuidへのgdbコマンド(例: sudo -u postgres -p 12345
ユーザーpostgres
として実行されているpid12345に接続します 。これはEclipseでは機能しません。実際、sudo
で実行します おそらく、ワークスペースにファイルのアクセス許可がめちゃくちゃになっている可能性があります。実行:
sudo chown -R ravi /home/ravi/workspace/
ファイルの所有権を修正します。
Eclipseを使用して他のユーザーIDでプロセスをデバッグする場合は、Eclipseでgdb
を実行する方法を理解する必要があります。 sudoで。 しない sudo
を使用してすべてのEclipseを実行するだけです 。
問題2:Eclipseの制御下でPostgreSQLを実行しようとしています
これ:
Eclipseにpostgres
を開始させようとしていることも示唆しています 直接。これは、 postmasterをデバッグしようとしている場合に非常に便利です。 、しかし、クエリプランナーについて話しているので、特定のバックエンドをデバッグしたいのは明らかです。 Eclipseでポストマスターを起動しても、そのためには役に立ちません。間違ったプロセスに接続されてしまいます。
おそらくPostgreSQLの内部に関するドキュメントを読む必要があると思います:
正しく行う
これがあなたがする必要があることです-私はJava開発にEclipseを使用し、vimとgdbでC開発を行っているので大まかな概要です:
-
デバッグビルドをコンパイルします PostgreSQLの(
./configure --enable-debug
でコンパイル また、できればCFLAGS="-ggdb -Og -fno-omit-frame-pointer"
)。--prefix
を指定します--prefix=$HOME/postgres-debug
のようにホームディレクトリ内 -
デバッグビルドの
bin
を配置しますPATH
の最初のディレクトリ 、例:export PATH=$HOME/postgres-debug/bin:$PATH
-
initdb -U postgres -D $HOME/postgres-debug-data
デバッグビルドからのPostgreSQLの新しいインスタンス -
PGPORT=5599 pg_ctl -D $HOME/postgres-debug-data -l $HOME/postgres-debug-data.log -w start
で新しいインスタンスを開始します -
PGPORT=5599 psql postgres
に接続します -
必要な設定をすべて行います
-
SELECT pg_backend_pid()
を使用してバックエンドプロセスIDを取得しますpsql
で セッション。そのセッションは開いたままにしておきます。デバッグするのはそれです。 -
デバッグしているPostgreSQL拡張ソースコードを含むEclipseプロジェクトを使用して、EclipseのデバッガーをそのプロセスIDにアタッチします。コンパイルしたPostgreSQLソースコードも検出できるようにEclipseが構成されていることを確認してください(その方法がわからない場合は、マニュアルを参照してください)。
-
必要なブレークポイントを設定して実行を再開します
-
psql
内 セッション、拡張機能を実行してブレークポイントに到達するために必要なことは何でもします -
Eclipseのブレークポイントで実行が一時停止したら、必要に応じてデバッグします。
基本的な誤解?
また、あなたが本当に これらすべてがどのように機能するかについて混乱しています。PostgreSQLはクライアント/サーバーアプリケーションです。 クライアントプログラムをデバッグしようとしている場合 libpqまたはodbcを使用し、一部のPostgreSQLバックエンド拡張コードでブレークポイントがトリガーされることを期待していますが、これは発生しません。クライアントアプリケーションは、TCP/IPソケットを介してPostgreSQLと通信します。これは別のプログラムです。 gdb
PostgreSQLサーバーは別個のプログラムであるため、クライアントに接続しているときにブレークポイントを設定することはできません。サーバーをデバッグする場合は、gdbをサーバーに接続する必要があります。 PostgreSQLは接続ごとに1つのプロセスを使用するため、gdbを正しいにアタッチする必要があります。 サーバープロセス。そのため、SELECT pg_backend_pid()
を使用すると言いました。 上記のプロセスIDに添付してください。
上記のリンク先の内部ドキュメントを参照してください。