Debugger

デバッガーを使用すると、開発者とDBAは、グラフィカルな動的環境を使用してサーバーサイドプログラムをテストおよびデバッグできます。デバッグできるプログラムの種類は、SPLのストアドプロシージャ、ファンクション、トリガー、パッケージのほか、PL/pgSQLのファンクションとトリガーです。

デバッガーはpgAdmin 4および* EDB Postgres Enterprise Manager*と統合されています。 WindowsホストにEDB Postgres Advanced Serverをインストールしている場合、pgAdmin 4が自動的にインストールされます。 pgAdmin 4アイコンはWindows Start メニューにあります。 EDB Postgres Advanced ServerホストがCentOSまたはLinuxシステム上にある場合、 yum を使用してpgAdmin4をインストールできます。コマンドラインを開き、スーパーユーザ権限を引き受けて、次のように入力します。

yum install edb-pgadmin4*

Linuxでは、 xx がEDB Postgres Advanced Serverのバージョン番号であるedb-asxx-server-pldebugger RPMパッケージもインストールする必要があります。 pgAdmin 4に関する情報は次の場所で入手できます。

https://www.pgadmin.org/

RPMインストールにより、[アプリケーション]メニューにpgAdmin4アイコンが追加されます。

デバッガーを使用してプログラムをテストするには、2つの基本的な方法があります。

  • スタンドアロンデバッグ。 デバッガーは、テストするプログラムを起動するために使用されます。プログラムで必要な入力パラメーター値を指定すると、すぐにプログラムのコードを観察してステップ実行できます。スタンドアロンデバッグは、プログラムの新規作成や初期の問題調査に使用される一般的な方法です。

  • インコンテキストデバッグ。 テスト対象のプログラムは、デバッガー以外のアプリケーションによって開始されます。まず、テストするプログラムにグローバルブレークポイントを設定します。プログラムを最初に呼び出すアプリケーションは、グローバルブレークポイントに遭遇します。アプリケーションは実行を中断し、デバッガーが呼び出されたプログラムの制御を取得します。次に、呼び出されたプログラムが呼び出し元のアプリケーションのコンテキスト内で実行されるときに、呼び出されたプログラムのコードを観察し、ステップ実行できます。デバッガーで呼び出されたプログラムのコードを完全にステップ実行すると、中断されたアプリケーションは実行を再開します。インコンテキスト デバッグは、呼び出し元のアプリケーションとの複雑な相互作用が原因でスタンドアロン デバッグを使用して問題を再現することが難しい場合に役立ちます。

デバッグツールと操作は、スタンドアロンとインコンテキストのどちらを使用しても同じです。違いは、デバッグするプログラムの呼び出し方法です。

以下のセクションでは、スタンドアロンのデバッグ方法を使用したデバッガーの特徴と機能について説明します。インコンテキストデバッグ用にデバッガーを起動する方法については、

Setting Global Breakpoint for In-Context Debugging で説明されています。

デバッガーの構成

デバッガーを使用する前に、 postgresql.conf ファイル( EDB Postgres Advanced Serverホームディレクトリのdata サブディレクトリにあります)を編集し、 shared_preload_libraries 構成パラメーターにリストされているライブラリに$libdir/plugin_debugger を追加します。

shared_preload_libraries = $libdir/dbms_pipe,$libdir/edb_gen,$libdir/plugin_debugger
  • Linuxでは、postgresql.conf ファイルは次の場所にあります:/var/lib/edb/asxx/data

  • Windowsでは、 postgresql.conf ファイルは次の場所にあります: C:\Program Files\edb\asxx\data

xx はEDB Postgres Advanced Serverのバージョンです。

shared_preload_libraries パラメータを変更した後、データベースサーバを再起動する必要があります。

デバッガーの起動

pgAdmin 4を使用して、スタンドアロンデバッグ用のデバッガーにアクセスします。デバッガーを開くには、 pgAdmin 4 Browser パネルでデバッグするストアドプロシージャまたはファンクションの名前を強調表示します。次に、 Object メニューから Debugging メニューに移動し、サブメニューから Debug を選択します。

Starting the Debugger from the Object menu

Starting the Debugger from the Object menu

図1:[オブジェクト]メニューからのデバッガーの起動

pgAdmin 4 Browser でストアドプロシージャまたはファンクションの名前を右クリックし、コンテキストメニューからDebugging 、およびDebug を選択することもできます。

Starting the Debugger from the object’s context menu

Starting the Debugger from the object’s context menu

図2:オブジェクトのコンテキストメニューからのデバッガーの起動

スタンドアロンデバッグを使用してトリガーをデバッグすることはできないことに注意してください。トリガーは、インコンテキスト デバッグを使用してデバッグする必要があります。インコンテキストデバッグのグローバルブレークポイントの設定については、

Setting Global Breakpoint for In-Context Debugging を参照してください。

パッケージをデバッグするには、デバッグするパッケージのパッケージノードの下にある特定のプロシージャまたはファンクションを強調表示し、ストアドプロシージャとファンクションと同じ指示に従います。

デバッガーウィンドウ

パラメーターを必要とするプログラムをスタンドアロンでデバッグしているときに、 Debugger ウィンドウを使用してパラメーター値を渡すことができます。デバッガーを起動すると、 Debugger ウィンドウが自動的に開き、プログラムが必要とするIN またはIN OUT パラメーターが表示されます。プログラムがIN またはIN OUT パラメーターを宣言していない場合、Debugger ウィンドウは開きません。

The Debugger window

The Debugger window

図3:デバッガーウィンドウ

Debugger ウィンドウのフィールドを使用して、各パラメーターの値を指定します。

  • Name フィールドには、仮パラメーター名が含まれます。

  • Type フィールドには、パラメーターのデータ型が含まれます。

  • Null? チェックボックスをオンにして、パラメーターがNULL 値であることを示します。

  • Value フィールドに式が含まれる場合は、Expression? チェックボックスをオンにします。

  • Value フィールドには、プログラムに渡されるパラメーター値が含まれています。

  • Use Default? チェックボックスをオンにして、プログラムがDefault Value フィールドの値を使用する必要があることを示します。

  • Default Value フィールドには、パラメーターのデフォルト値が含まれます。

Tab キーを押して、データ入力用のリスト内の次のパラメーターを選択するか、 Value フィールドをクリックしてデータ入力用のパラメーターを選択します。

初期化セクションを持つパッケージのメンバーであるプロシージャまたはファンクションをデバッグする場合は、 Debug Package Initializer チェックボックスをオンにして、パッケージの初期化セクションにステップインするように指示し、プロシージャをデバッグする前に初期化セクションのコードをデバッグできますまたは機能。このチェックボックスを選択しない場合、デバッガーはパッケージの初期化セクションを実行します。実行時にコードの個々の行を表示したりステップ実行したりすることはできません。

必要なパラメーター値を入力したら、 Debug ボタンをクリックしてデバッグプロセスを開始します。 Cancel ボタンをクリックして、デバッガーを終了します。

注釈

インコンテキストデバッグ中に`Debugger` ウィンドウが開きません。代わりに、デバッグするプログラムを呼び出すアプリケーションは、必要な入力パラメーター値を指定する必要があります。

プログラムコードをステップ実行してデバッグサイクル全体を完了すると、 Debugger ウィンドウが再度開き、新しいパラメーター値を入力してデバッグサイクルを繰り返したり、デバッグセッションを終了したりできます。

メインデバッガーウィンドウ

メインデバッガーウィンドウには 2 つのパネルがあります。

  • 上部のProgram Body パネルには、プログラムのソースコードが表示されます。

  • 下部のTabs パネルには、さまざまな情報のタブセットがあります。

トップパネルにあるTool Bar アイコンを使用して、デバッグ機能にアクセスします。

The Main Debugger window

The Main Debugger window

図4:メインデバッガーウィンドウ

2つのパネルについては、次のセクションで説明します。

プログラム本体パネル

Program Body パネルには、デバッグ中のプログラムのソースコードが表示されます。

The Program Body

The Program Body

図5:プログラム本体

この図は、デバッガーが SELECT ステートメントを実行しようとしていることを示しています。プログラム本体の青色のインジケーターは、実行する次のステートメントを強調表示します。

タブパネル

下部のTabs パネルを使用して、パラメーター値またはローカル変数を表示または変更したり、 RAISE INFO によって生成されたメッセージと関数の結果を表示したりできます。

パネルのタブに表示される情報は次のとおりです。

  • Parameters タブには、現在のパラメーター値が表示されます。

  • Local variables タブには、プログラム内で宣言された変数の値が表示されます。

  • Messages タブには、プログラムの実行時に返された結果が表示されます。

  • Results タブには、ファンクションのRETURN ステートメントの値など、プログラムの結果(該当する場合)が表示されます。

  • Stack tab はコールスタックを表示します。

次の図は、さまざまなタブの結果を示しています。

The Parameters tab

The Parameters tab

図6:[パラメーター]タブ

The Local variables tab

The Local variables tab

図7:ローカル変数タブ

The Messages tab

The Messages tab

図8:[メッセージ]タブ

The Results tab

The Results tab

図9:[結果]タブ

スタックタブ

Stack タブには、現在コールスタックにあるプログラム(呼び出されたがまだ完了していないプログラム)のリストが表示されます。プログラムを呼び出すと、[ Stack ]タブに表示されるリストの先頭にプログラムの名前が追加されます。プログラムが終了すると、その名前はリストから削除されます。

Stack タブには、プログラム呼び出しに関する情報も表示されます。情報には次のものが含まれます。

  • プログラム内の呼び出しの場所

  • 呼び出し引数

  • 呼び出されているプログラムの名前

コールスタックを確認すると、一連のネストされたプログラムの実行過程をトレースできます。

A debugged program calling a subprogram

A debugged program calling a subprogram

図10:サブプログラムを呼び出すデバッグ済みプログラム

上の図は、 emp_query_caller がemp_query という名前のサブプログラムを呼び出そうとしていることを示しています。 emp_query_caller は現在、コールスタックの先頭にあります。

emp_query への呼び出しが実行されると、 emp_query が Stack タブの上部に表示され、そのコードがProgram Body パネルに表示されます。

Debugging the called subprogram

Debugging the called subprogram

図11:呼び出されたサブプログラムのデバッグ

サブプログラムの実行が完了すると、制御は呼び出し元プログラム(emp_query_caller) に戻り、現在はStack タブの上部に表示されています。

Control returns from debugged subprogram

Control returns from debugged subprogram

図12:デバッグされたサブプログラムから制御が戻る

プログラムのデバッグ

次の操作を実行して、プログラムをデバッグできます。

  • プログラムを一度に 1 行ずつ実行します

  • ブレークポイントに到達するまでプログラムを実行します

  • プログラム内のローカル変数値を表示および変更する

コードのステップ実行

ツールバーのアイコンを使用して、デバッガーでプログラムをステップ実行します。

The Tool bar icons

The Tool bar icons

図13:ツールバーのアイコン

アイコンの目的は次のとおりです。

  • ステップイン。 Step into アイコンをクリックして、現在強調表示されているコード行を実行します。

  • ステップオーバー。 Step over アイコンをクリックしてコード行を実行し、コードによって呼び出されるサブファンクションをステップオーバーします。サブファンクションは実行されますが、ブレークポイントが含まれていない限りデバッグされません。

  • 続行/開始。 Continue/Start アイコンをクリックして強調表示されたコードを実行し、プログラムがブレークポイントに到達するか完了するまで続行します。

  • 停止。 Stop アイコンをクリックして、プログラムの実行を停止します。

ブレークポイントの使用

デバッガーはプログラムを実行すると、ブレークポイントに到達するたびに一時停止します。デバッガーが一時停止したら、ローカル変数を監視または変更したり、コールスタックのエントリに移動して、変数を監視したり、他のブレークポイントを設定したりできます。次のステップイン、ステップオーバー、または続行操作により、デバッガーはブレークポイントに続くコードの次の行から実行を再開します。ブレークポイントには次の 2 種類があります。

ローカル ブレークポイント - ローカル ブレークポイントは、プログラム内の実行可能なコード行に設定できます。デバッガーは、ローカルブレークポイントが設定されている行に到達すると実行を一時停止します。

グローバルブレークポイント - 任意のセッションがそのブレークポイントに到達すると、グローバルブレークポイントがトリガーされます。プログラムのコンテキスト デバッグを実行する場合は、グローバル ブレークポイントを設定します。プログラムにグローバルブレークポイントが設定されている場合、グローバルブレークポイントを設定したデバッグセッションは、そのプログラムが別のセッションで呼び出されるまで待機します。グローバルブレークポイントはスーパーユーザーのみが設定できます。

ローカル ブレークポイントを作成するには、ローカル ブレークポイントを設定するコード行の左側の灰色の網掛けの余白内を左クリックします。グレーの網掛けの余白をクリックする場所は、ソースコードの12行目にブレークポイントドットが表示される場所のように、余白の右側にある必要があります。

デバッガーは作成されると、余白に黒い点を表示し、選択したコード行にブレークポイントが設定されたことを示します。

Set a breakpoint by clicking in left-hand margin

Set a breakpoint by clicking in left-hand margin

図14:左側のマージンをクリックしてブレークポイントを設定する

ローカル ブレークポイントは必要な数だけ設定できます。ローカル ブレークポイントは、デバッグ セッションの間、削除されるまで有効です。

ローカルブレークポイントの削除

ローカルブレークポイントを削除するには、 Program Body パネルの灰色の網掛けの余白にあるブレークポイントのドットを左クリックします。ドットが消え、ブレークポイントが削除されたことを示します。

Clear all breakpoints アイコンをクリックすると、現在Program Body フレームに表示されているプログラムからすべてのブレークポイントを削除できます。

Clear all breakpoints icon

Clear all breakpoints icon

図15:すべてのブレークポイントをクリアするアイコン

注釈

上記のアクションのいずれかを実行すると、現在 Program Body パネルに表示されているプログラム内のブレークポイントのみが削除されます。呼び出されたサブプログラム内のブレークポイントまたは現在 Program Body パネルに表示されているプログラムを呼び出すプログラム内のブレークポイントは削除されません。

インコンテキストデバッグのグローバルブレークポイントを設定する

インコンテキストデバッグ用にグローバルブレークポイントを設定するには、 Browser パネルでブレークポイントを設定するストアドプロシージャ、ファンクション、またはトリガーを強調表示します。 Object メニューをナビゲートして、 Debugging 、次に Set Breakpoint を選択します。

Setting a global breakpoint from the Object menu

Setting a global breakpoint from the Object menu

図16:[オブジェクト]メニューからのグローバルブレークポイントの設定

または、グローバルブレークポイントを設定するストアドプロシージャ、ファンクション、またはトリガーの名前を右クリックし、次のようにコンテキストメニューからSet Breakpoint を選択します。

Setting a global breakpoint from the object’s context menu

Setting a global breakpoint from the object’s context menu

図17:オブジェクトのコンテキストメニューからのグローバルブレークポイントの設定

トリガーにグローバル ブレークポイントを設定するには、トリガーを含むテーブルノードを展開し、デバッグする特定のトリガーを強調表示し、ストアドプロシージャとファンクションの場合と同じ指示に従います。

パッケージにグローバルブレークポイントを設定するには、デバッグするパッケージのパッケージノードの下の特定のプロシージャまたはファンクションを強調表示し、ストアドプロシージャおよびファンクションの場合と同じ指示に従います。

Set Breakpoint を選択すると、デバッガーウィンドウが開き、アプリケーションがデバッグするプログラムを呼び出すのを待ちます。

Waiting for invocation of program to be debugged

Waiting for invocation of program to be debugged

図18:プログラムの呼び出しがデバッグされるのを待っています

PSQL クライアントが select_emp 関数(グローバル ブレークポイントが設定されています)を呼び出します。

$ psql edb enterprisedb
psql.bin (14.0.0, server 14.0.0)
Type "help" for help.

edb=# SELECT select_emp(7900);

select_emp ファンクションは、デバッガーでプログラムをステップ実行するまで完了しません。

Program on which a global breakpoint has been set

Program on which a global breakpoint has been set

図19:グローバルブレークポイントが設定されたプログラム

ステップイン、ステップオーバー、続行、またはローカルブレークポイントの設定など、前述の操作を使用してプログラムをデバッグできます。プログラムの実行をステップスルーすると、呼び出し元のアプリケーション(PSQL)が制御を取り戻し、select_emp ファンクションが実行を完了し、その出力が表示されます。

$ psql edb enterprisedb
psql.bin (14.0.0, server 14.0.0)
Type "help" for help.

edb=# SELECT select_emp(7900);
__OUTPUT__
INFO: Number    : 7900
INFO: Name      : JAMES
INFO: Hire Date : 12/03/1981
INFO: Salary    : 950.00
INFO: Commission: 0.00
INFO: Department: SALES
 select_emp
- -----------
(1 row)

この時点で、デバッガーセッションを終了できます。デバッガーセッションを終了しない場合、プログラムを呼び出す次のアプリケーションがグローバルブレークポイントに遭遇し、デバッグサイクルが再び開始されます。

デバッガーの終了

デバッガーセッションを終了してデバッガーを終了するには、右上隅にある閉じるアイコン (x) をクリックしてタブを閉じます。

Exiting from the Debugger

Exiting from the Debugger

図20:デバッガーの終了