デバッガー

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

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

yum install edb-pgadmin4*

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

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

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

  • Standalone Debugging. デバッガーを使用して、テストするプログラムを開始します。プログラムに必要な入力パラメーター値を指定すると、プログラムのコードをすぐに観察してステップスルーできます。スタンドアロンデバッグは、新しいプログラムおよび最初の問題調査に使用される一般的な方法です。

  • **In-Context Debugging.**テストするプログラムは、デバッガー以外のアプリケーションによって開始されます。最初に、テストするプログラムに*グローバルブレークポイント* を設定します。プログラムへの最初の呼び出しを行うアプリケーションは、グローバルブレークポイントに遭遇します。アプリケーションは実行を一時停止し、その時点でデバッガーが呼び出されたプログラムを制御します。その後、呼び出し元アプリケーションのコンテキスト内で実行される、呼び出されたプログラムのコードを観察してステップスルーできます。デバッガーで呼び出されたプログラムのコードを完全にステップスルーした後、中断されたアプリケーションは実行を再開します。コンテキスト内デバッグは、呼び出し側アプリケーションとの複雑な相互作用のためにスタンドアロンデバッグを使用して問題を再現することが困難な場合に役立ちます。

デバッグツールと操作は、スタンドアロンデバッグを使用してもコンテキスト内デバッグを使用しても同じです。違いは、デバッグするプログラムの起動方法にあります。

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

デバッガーの構成

デバッガを使用する前に、 postgresql.conf ファイル(AdvancedServerホームディレクトリの 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 にあります

x はAdvancedServerのバージョンです。

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

デバッガーの起動

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

Starting the Debugger from the Object menu

オブジェクトメニューからデバッガーを起動

pgAdmin4のストアドプロシージャまたは関数の名前を右クリックして Browser とし、コンテキストメニューから Debugging 、 Debug を選択することもできます。

Starting the Debugger from the object’s context menu

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

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

パッケージをデバッグするには、デバッグするパッケージのパッケージノードの下の特定のプロシージャまたは関数を強調表示し、ストアドプロシージャおよび関数の場合と同じ指示に従います。

デバッガーウィンドウ

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

The Debugger window

デバッガウィンドウ

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

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

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

プログラム本体パネル

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

The Program Body

プログラム本体

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

タブパネル

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

以下は、パネルのタブによって表示される情報です。

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

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

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

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

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

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

The Parameters tab

[パラメータ]タブ

The Local variables tab

ローカル変数タブ

The Messages tab

[メッセージ]タブ

The Results tab

結果タブ

スタックタブ

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

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

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

  • 呼び出し引数

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

コールスタックを確認すると、一連のネストされたプログラムを介して実行コースを追跡するのに役立ちます。

A debugged program calling a subprogram

サブプログラムを呼び出すデバッグプログラム

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

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

Debugging the called subprogram

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

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

Control returns from debugged subprogram

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

プログラムのデバッグ

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

  • プログラムを1行ずつステップ実行します

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

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

コードのステップ実行

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

The Tool bar icons

ツールバーのアイコン

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

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

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

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

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

ブレークポイントを使用する

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

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

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

ローカルブレークポイントを作成するには、ローカルブレークポイントを設定するコードの行の左側にある灰色の影付きマージン内を左クリックします。グレーの影付きのマージンをクリックする場所は、ソースコード行12にブレークポイントドットが表示されているスポットのように、マージンの右側に近いはずです。

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

Set a breakpoint by clicking in left-hand margin

左マージンをクリックしてブレークポイントを設定します

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

Removing a Local Breakpoint

ローカルブレークポイントを削除するには、 Program Body パネルのグレーの影付きマージンにあるブレークポイントドット上でマウスを左クリックします。ドットが消え、ブレークポイントが削除されたことを示します。

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

Clear all breakpoints icon

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

注釈

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

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

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

Setting a global breakpoint from the Object menu

オブジェクトメニューからグローバルブレークポイントを設定

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

Setting a global breakpoint from the object's context menu

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

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

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

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

Waiting for invocation of program to be debugged

デバッグするプログラムの呼び出しを待機中

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

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

edb=# SELECT select_emp(7900);

select_emp 機能は、デバッガでプログラムをステップスルーするまで完了しません。

Program on which a global breakpoint has been set

グローバルブレークポイントが設定されているプログラム

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

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

edb=# SELECT select_emp(7900);
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

デバッガからの終了