問題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に添付してください。
上記のリンク先の内部ドキュメントを参照してください。