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に関する情報は次の場所で入手できます。
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/dataWindowsでは、
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¶
図1:[オブジェクト]メニューからのデバッガーの起動
pgAdmin 4 Browser
でストアドプロシージャまたはファンクションの名前を右クリックし、コンテキストメニューからDebugging
、およびDebug を選択することもできます。
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¶
図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¶
図4:メインデバッガーウィンドウ
2つのパネルについては、次のセクションで説明します。
プログラム本体パネル¶
Program Body
パネルには、デバッグ中のプログラムのソースコードが表示されます。
The Program Body¶
図5:プログラム本体
この図は、デバッガーが SELECT
ステートメントを実行しようとしていることを示しています。プログラム本体の青色のインジケーターは、実行する次のステートメントを強調表示します。
タブパネル¶
下部のTabs
パネルを使用して、パラメーター値またはローカル変数を表示または変更したり、
RAISE INFO
によって生成されたメッセージと関数の結果を表示したりできます。
パネルのタブに表示される情報は次のとおりです。
Parametersタブには、現在のパラメーター値が表示されます。Local variablesタブには、プログラム内で宣言された変数の値が表示されます。Messagesタブには、プログラムの実行時に返された結果が表示されます。Resultsタブには、ファンクションのRETURNステートメントの値など、プログラムの結果(該当する場合)が表示されます。Stack tabはコールスタックを表示します。
次の図は、さまざまなタブの結果を示しています。
The Parameters tab¶
図6:[パラメーター]タブ
The Local variables tab¶
図7:ローカル変数タブ
The Messages tab¶
図8:[メッセージ]タブ
The Results tab¶
図9:[結果]タブ
スタックタブ¶
Stack
タブには、現在コールスタックにあるプログラム(呼び出されたがまだ完了していないプログラム)のリストが表示されます。プログラムを呼び出すと、[
Stack
]タブに表示されるリストの先頭にプログラムの名前が追加されます。プログラムが終了すると、その名前はリストから削除されます。
Stack
タブには、プログラム呼び出しに関する情報も表示されます。情報には次のものが含まれます。
プログラム内の呼び出しの場所
呼び出し引数
呼び出されているプログラムの名前
コールスタックを確認すると、一連のネストされたプログラムの実行過程をトレースできます。
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¶
図11:呼び出されたサブプログラムのデバッグ
サブプログラムの実行が完了すると、制御は呼び出し元プログラム(emp_query_caller)
に戻り、現在はStack タブの上部に表示されています。
Control returns from debugged subprogram¶
図12:デバッグされたサブプログラムから制御が戻る
プログラムのデバッグ¶
次の操作を実行して、プログラムをデバッグできます。
プログラムを一度に 1 行ずつ実行します
ブレークポイントに到達するまでプログラムを実行します
プログラム内のローカル変数値を表示および変更する
コードのステップ実行¶
ツールバーのアイコンを使用して、デバッガーでプログラムをステップ実行します。
The Tool bar icons¶
図13:ツールバーのアイコン
アイコンの目的は次のとおりです。
ステップイン。
Step intoアイコンをクリックして、現在強調表示されているコード行を実行します。ステップオーバー。
Step overアイコンをクリックしてコード行を実行し、コードによって呼び出されるサブファンクションをステップオーバーします。サブファンクションは実行されますが、ブレークポイントが含まれていない限りデバッグされません。続行/開始。
Continue/Startアイコンをクリックして強調表示されたコードを実行し、プログラムがブレークポイントに到達するか完了するまで続行します。停止。
Stopアイコンをクリックして、プログラムの実行を停止します。
ブレークポイントの使用¶
デバッガーはプログラムを実行すると、ブレークポイントに到達するたびに一時停止します。デバッガーが一時停止したら、ローカル変数を監視または変更したり、コールスタックのエントリに移動して、変数を監視したり、他のブレークポイントを設定したりできます。次のステップイン、ステップオーバー、または続行操作により、デバッガーはブレークポイントに続くコードの次の行から実行を再開します。ブレークポイントには次の 2 種類があります。
ローカル ブレークポイント - ローカル ブレークポイントは、プログラム内の実行可能なコード行に設定できます。デバッガーは、ローカルブレークポイントが設定されている行に到達すると実行を一時停止します。
グローバルブレークポイント - 任意のセッションがそのブレークポイントに到達すると、グローバルブレークポイントがトリガーされます。プログラムのコンテキスト デバッグを実行する場合は、グローバル ブレークポイントを設定します。プログラムにグローバルブレークポイントが設定されている場合、グローバルブレークポイントを設定したデバッグセッションは、そのプログラムが別のセッションで呼び出されるまで待機します。グローバルブレークポイントはスーパーユーザーのみが設定できます。
ローカル ブレークポイントを作成するには、ローカル ブレークポイントを設定するコード行の左側の灰色の網掛けの余白内を左クリックします。グレーの網掛けの余白をクリックする場所は、ソースコードの12行目にブレークポイントドットが表示される場所のように、余白の右側にある必要があります。
デバッガーは作成されると、余白に黒い点を表示し、選択したコード行にブレークポイントが設定されたことを示します。
Set a breakpoint by clicking in left-hand margin¶
図14:左側のマージンをクリックしてブレークポイントを設定する
ローカル ブレークポイントは必要な数だけ設定できます。ローカル ブレークポイントは、デバッグ セッションの間、削除されるまで有効です。
ローカルブレークポイントの削除¶
ローカルブレークポイントを削除するには、 Program Body
パネルの灰色の網掛けの余白にあるブレークポイントのドットを左クリックします。ドットが消え、ブレークポイントが削除されたことを示します。
Clear all breakpoints
アイコンをクリックすると、現在Program Body
フレームに表示されているプログラムからすべてのブレークポイントを削除できます。
Clear all breakpoints icon¶
図15:すべてのブレークポイントをクリアするアイコン
注釈
上記のアクションのいずれかを実行すると、現在 Program Body パネルに表示されているプログラム内のブレークポイントのみが削除されます。呼び出されたサブプログラム内のブレークポイントまたは現在 Program Body パネルに表示されているプログラムを呼び出すプログラム内のブレークポイントは削除されません。
インコンテキストデバッグのグローバルブレークポイントを設定する¶
インコンテキストデバッグ用にグローバルブレークポイントを設定するには、
Browser
パネルでブレークポイントを設定するストアドプロシージャ、ファンクション、またはトリガーを強調表示します。
Object メニューをナビゲートして、 Debugging 、次に
Set Breakpoint を選択します。
Setting a global breakpoint from the Object menu¶
図16:[オブジェクト]メニューからのグローバルブレークポイントの設定
または、グローバルブレークポイントを設定するストアドプロシージャ、ファンクション、またはトリガーの名前を右クリックし、次のようにコンテキストメニューからSet Breakpoint
を選択します。
Setting a global breakpoint from the object’s context menu¶
図17:オブジェクトのコンテキストメニューからのグローバルブレークポイントの設定
トリガーにグローバル ブレークポイントを設定するには、トリガーを含むテーブルノードを展開し、デバッグする特定のトリガーを強調表示し、ストアドプロシージャとファンクションの場合と同じ指示に従います。
パッケージにグローバルブレークポイントを設定するには、デバッグするパッケージのパッケージノードの下の特定のプロシージャまたはファンクションを強調表示し、ストアドプロシージャおよびファンクションの場合と同じ指示に従います。
Set Breakpoint
を選択すると、デバッガーウィンドウが開き、アプリケーションがデバッグするプログラムを呼び出すのを待ちます。
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¶
図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¶
図20:デバッガーの終了