Debugger¶
</ div>
デバッガーにより、開発者とDBAは、グラフィカルな動的環境を使用してサーバサイドプログラムをテストおよびデバッグできます。デバッグできるプログラムのタイプは、SPLストアドプロシージャ、関数、トリガー、パッケージソフト、およびPL / pgSQL関数とトリガーです。
デバッガーは、* pgAdmin 4 および EDB Postgres Enterprise
Manager*と統合されています。 Advanced
ServerをWindowsホストにインストールした場合、pgAdmin
4が自動的にインストールされます。 Windows StartメニューにpgAdmin
4アイコンがあります。 Advanced
ServerホストがCentOSまたはLinuxシステム上にある場合、yumを使用してpgAdmin4をインストールできます。コマンドラインを開き、スーパーユーザ権限を引き受けて、次を入力します。
yum install edb-pgadmin4*
Linuxでは、edb-asxx-server-pldebugger
RPMパッケージ(xxはAdvanced
Serverのバージョン番号)もインストールする必要があります。 pgAdmin
4に関する情報は、次の場所で入手できます。
RPMをインストールすると、pgAdmin4アイコンが[アプリケーション]メニューに追加されます。
デバッガーを使用してプログラムをテストするには、2つの基本的な方法があります。
スタンドアロンデバッグ。デバッガーは、テストするプログラムをスタートするために使用されます。プログラムに必要な入力パラメータ値を指定すると、プログラムのコードをすぐに観察してステップスルーできます。スタンドアロンデバッグは、新しいプログラムおよび最初の問題調査に使用される一般的なメソッドです。
インコンテキストデバッグ。テストするプログラムは、デバッガー以外のアプリケーションによって開始されます。最初に、テストするプログラムにグローバルブレークポイントを設定します。プログラムへの最初の呼び出しを行うアプリケーションは、グローバルブレークポイントに遭遇します。アプリケーションは実行を一時停止します。その時点で、デバッガーは呼び出されたプログラムを制御します。その後、呼び出し元アプリケーションのコンテキスト内で実行される、呼び出されたプログラムのコードを観察してステップスルーできます。デバッガーで呼び出されたプログラムのコードを完全にステップスルーした後、中断されたアプリケーションは実行を再開します。コンテキスト内デバッグは、呼び出し側アプリケーションとの複雑な相互作用のためにスタンドアロンデバッグを使用して問題を再現することが困難な場合に役立ちます。
デバッグツールと操作は、スタンドアロンデバッグを使用してもコンテキスト内デバッグを使用しても同じです。違いは、デバッグするプログラムの起動方法にあります。
以下のセクションでは、スタンドアロンデバッグメソッドを使用したデバッガの機能について説明します。インコンテキストデバッグ用のデバッガーの起動方法については、Setting Global Breakpoint for In-Context Debuggingで説明しています。
デバッガーの構成¶
デバッガーを使用する前に、shared_preload_libraries設定パラメータにリストされているライブラリーに$libdir/plugin_debuggerを追加して、postgresql.confファイル(
Advanced
Serverホームディレクトリディレクトリーのdataサブディレクトリにあります)を編集します。
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はAdvanced Serverのバージョンです。
shared_preload_librariesパラメータを変更した後、データベースサーバをリスタートする必要があります。
デバッガーの起動¶
pgAdmin
4を使用して、スタンドアロンデバッグ用のデバッガーにアクセスします。デバッガーを開くには、pgAdmin
4
Browserパネルでデバッグするストアドプロシージャまたはファンクションの名前を強調表示します。次に、ObjectメニューからDebuggingメニューに移動し、サブメニューからDebugを選択します。
Starting the Debugger from the Object menu¶
図1:オブジェクトメニューからのデバッガーの起動</ div>
pgAdmin 4
Browserのストアドプロシージャまたはファンクションの名前を右クリックして、コンテキストメニューからDebugging、およびDebugを選択することもできます。
Starting the Debugger from the object’s context menu¶
図2:オブジェクトのコンテキストメニューからのデバッガーの起動</ div>
トリガーは、スタンドアロンデバッグを使用してデバッグできないことに注意してください。トリガーは、インコンテキストデバッグを使用してデバッグする必要があります。コンテキスト内デバッグ用のグローバルブレークポイントの設定については、Setting Global Breakpoint for In-Context Debuggingを参照してください。
パッケージをデバッグするには、デバッグするパッケージのパッケージノードの下にある特定のプロシージャまたはファンクションを強調表示し、ストアドプロシージャおよび関数の場合と同じ指示に従います。
デバッガーウィンドウ¶
パラメーターを予期するプログラムをスタンドアロンでデバッグしている場合、Debuggerウィンドウを使用してパラメータ値を渡すことができます。デバッガをスタートすると、Debuggerウィンドウが自動的に開き、プログラムで予期されるINまたはIN OUTパラメーターが表示されます。プログラムがINまたはIN OUTパラメーターを宣言していない場合、Debuggerウィンドウは開きません。
The Debugger window¶
図3:デバッガーウィンドウ</ div>
Debuggerウィンドウのフィールドを使用して、各パラメータの値を指定します。
Nameフィールドには、仮パラメータ名前が含まれます。Typeフィールドには、パラメータデータ型が含まれています。Null?チェックボックスをオンにして、パラメータがNULL値であることを示します。Valueフィールドに式が含まれている場合は、Expression?チェックボックスをオンにします。Valueフィールドには、プログラムに渡されるパラメータ値が含まれます。Use Default?チェックボックスをオンにして、プログラムがDefault Valueフィールドの値を使用することを示します。Default Valueフィールドには、パラメータのデフォルト値が含まれます。
Tabキーを押してリスト内のデータエントリー用の次のパラメータを選択するか、Valueフィールドをクリックしてデータエントリー用のパラメータを選択します。
初期化セクションを持つパッケージのメンバであるプロシージャまたはファンクションをデバッグする場合は、Debug Package Initializerチェックボックスをオンにして、パッケージ初期化セクションにステップインするようデバッガに指示し、プロシージャをデバッグする前に初期化セクションコードをデバッグできるようにします。またはファンクション。このチェックボックスを選択しない場合、デバッガーはパッケージの初期化セクションを実行しますが、実行時にコードの個々の行を表示したりステップ実行したりすることはできません。
目的のパラメータ値を入力したら、Debugボタンをクリックしてデバッグプロセスをスタートします。
Cancelボタンをクリックして、デバッガーを終了します。
!!! Note *
コンテキスト内のデバッグ中にDebuggerウィンドウは開きません。代わりに、デバッグするプログラムを呼び出すアプリケーションは、必要な入力パラメータ値を提供する必要があります。
プログラムコードをステップ実行して完全なデバッグサイクルを完了すると、Debuggerウィンドウが再び開き、新しいパラメータ値を入力してデバッグサイクルを繰り返すか、デバッグセッションを終了できます。
メインデバッガーウィンドウ¶
メインデバッガーウィンドウには2つのパネルがあります。
上部の
Program Bodyパネルには、プログラムソースコードが表示されます。下部の
Tabsパネルには、さまざまな情報のタブのセットがあります。
デバッグ機能にアクセスするには、上部パネルにあるTool Barアイコンを使用します。
The Main Debugger window¶
図4:メインデバッガーウィンドウ</ div>
2つのパネルについては、次のセクションで説明します。
プログラム本体パネル¶
Program Bodyパネルには、デバッグ中のプログラムのソースコードが表示されます。
The Program Body¶
図5:プログラム本体</ div>
この図は、デバッガーがSELECTステートメントを実行しようとしていることを示しています。プログラム本体の青いインジケータは、実行次のステートメントを強調表示します。
タブパネル¶
下部のTabsパネルを使用して、パラメータ値またはローカル変数をビューまたは変更したり、RAISE INFOおよびファンクションの結果によって生成されたメッセージをビューしたりできます。
以下は、パネルのタブによって表示される情報です。
[
Parameters]タブには、現在のパラメータ値が表示されます。[
Local variables]タブには、プログラム内で宣言された変数の値が表示されます。Messagesタブには、プログラムの実行時に返される結果が表示されます。[
Results]タブには、ファンクションのRETURNステートメントの値などのプログラム結果(該当する場合)が表示されます。Stack tabはコールスタックを表示します。
次の図は、さまざまなタブの結果を示しています。
The Parameters tab¶
図6:[パラメーター]タブ</ div>
The Local variables tab¶
図7:[ローカル変数]タブ</ div>
The Messages tab¶
図8:[メッセージ]タブ</ div>
The Results tab¶
図9:[結果]タブ</ div>
スタックタブ¶
</ div>
Stackタブには、現在コールスタックにあるプログラム(呼び出されたが、まだ完了していないプログラム)のリストが表示されます。プログラムが呼び出されると、Stackタブに表示されるリストの上部にプログラムの名前が追加されます。プログラムが終了すると、その名前はリストから削除されます。
Stackタブには、プログラム呼び出しに関する情報も表示されます。次の情報が含まれます。
プログラム内の呼び出しの場所
呼び出し引数
呼び出されるプログラムの名前
コールスタックを確認すると、シリーズのネストされたプログラムを介して実行コースを追跡するのにヘルプます。
A debugged program calling a subprogram¶
図10:サブプログラムを呼び出すデバッグプログラム</ div>
上の図は、emp_query_callerがemp_query名前付けのサブプログラムを呼び出そうとしていることを示しています。
emp_query_callerは現在、コールスタックの最上位にあります。
emp_queryの呼び出しが実行されると、emp_queryがStackタブの上部に表示され、そのコードがProgram Bodyパネルに表示されます。
Debugging the called subprogram¶
図11:呼び出されたサブプログラムのデバッグ</ div>
サブプログラムの実行が完了すると、制御は呼び出し側プログラム(emp_query_caller)に戻り、Stackタブの上部に表示されます。
Control returns from debugged subprogram¶
図12:デバッグされたサブプログラムからの制御の戻り値</ div>
プログラムのデバッグ¶
次の操作を実行して、プログラムをデバッグできます。
一度に1行ずつプログラムをステップ実行します
ブレークポイントに達するまでプログラムを実行します
プログラム内のローカル変数値の表示と変更
コードのステップ実行¶
ツールアイコンを使用して、デバッガーでプログラムをステップ実行します。
The Tool bar icons¶
図13:ツールバーアイコン</ div>
アイコンの目的は次のとおりです。
ステップイン。
Step intoアイコンをクリックして、現在強調表示されているコード行を実行します。ステップオーバー
Step overアイコンをクリックしてコード行を実行し、コードによって呼び出されたサブファンクションをステップオーバーします。サブ関数は実行されますが、ブレークポイントが含まれていない限りデバッグされません。続行/開始。
Continue/Startアイコンをクリックして、強調表示されたコードを実行し、プログラムがブレークポイントに到達するか完了するまで続行します。停止。
Stopアイコンをクリックして、プログラムの実行を停止します。
ブレークポイントを使用する¶
デバッガーがプログラムを実行すると、ブレークポイントに到達するたびに一時停止します。デバッガーが一時停止すると、ローカル変数を監視または変更したり、コールスタックのエントリーに移動して変数を監視したり、他のブレークポイントを設定したりできます。操作への次のステップ、ステップオーバー、または継続オペレーションは、ブレークポイントに続くコードの次の行で実行をデバッガに強制します。ブレークポイントには2つのタイプがあります。
ローカルブレークポイント-ローカルブレークポイントは、プログラム内の実行可能なコード行に設定できます。デバッガーは、ローカルブレークポイントが設定されている行に到達すると実行を一時停止します。
グローバルブレークポイント-セッションがそのブレークポイントに到達すると、グローバルブレークポイントがトリガーされます。プログラムのコンテキスト内デバッグを実行する場合は、グローバルブレークポイントを設定します。グローバルブレークポイントがプログラムに設定されると、グローバルブレークポイントを設定するデバッグセッションは、そのプログラムが別のセッションで呼び出されるまで待機します。グローバルブレークポイントは、スーパーユーザのみが設定できます。
ローカルブレークポイントを作成するには、ローカルブレークポイントを設定するコードの行の左側にある灰色の影付きマージン内を左クリックします。グレーの影付きのマージンをクリックする場所は、ソースコード行12にブレークポイントドットが表示されるスポットのように、マージンの右側に近いはずです。
作成されると、デバッガーはマージンに暗いドットを表示し、選択したコード行にブレークポイントが設定されたことを示します。
Set a breakpoint by clicking in left-hand margin¶
図14:左マージンをクリックしてブレークポイントを設定</ div>
必要な数のローカルブレークポイントを設定できます。ローカルブレークポイントは、削除されるまでデバッグセッションの間有効です。
ローカルブレークポイントの削除
ローカルブレークポイントを削除するには、Program Bodyパネルのグレーの影付きマージンにあるブレークポイントドット上でマウスを左クリックします。ドットが消え、ブレークポイントが削除されたことを示します。
Clear all breakpointsアイコンをクリックすると、現在Program Bodyフレームに表示されているプログラムからすべてのブレークポイントを削除できます。
Clear all breakpoints icon¶
図15:すべてのブレークポイントアイコンをクリア</ div>
!!! Note *
上記のアクションのいずれかを実行すると、現在Program Bodyパネルに表示されているプログラムのブレークポイントのみが削除されます。呼び出されたサブプログラムのブレークポイント、または現在Program Bodyパネルに表示されているプログラムを呼び出すプログラムのブレークポイントは削除されません。
インコンテキストデバッグ用のグローバルブレークポイントの設定¶
</ div>
インコンテキストデバッグ用のグローバルブレークポイントを設定するには、Browserパネルでブレークポイントを設定するストアドプロシージャ、ファンクション、またはトリガーを強調表示します。
Objectメニューをナビゲートして、Debugging、次にSet Breakpointを選択します。
Setting a global breakpoint from the Object menu¶
図16:[オブジェクト]メニューからグローバルブレークポイントを設定</ div>
または、次のように、グローバルブレークポイントを設定するストアドプロシージャ、ファンクション、またはトリガーの名前を右クリックして、Debuggingを選択し、コンテキストメニューからSet Breakpointを選択します。
Setting a global breakpoint from the object’s context menu¶
図17:オブジェクトのコンテキストメニューからグローバルブレークポイントを設定</ div>
トリガーにグローバルブレークポイントを設定するには、トリガーを含むテーブルノードを展開し、デバッグする特定のトリガーを強調表示し、ストアドプロシージャと関数の場合と同じ指示に従います。
パッケージにグローバルブレークポイントを設定するには、デバッグするパッケージのパッケージノードの下にある特定のプロシージャまたはファンクションを強調表示し、ストアドプロシージャおよび関数の場合と同じ指示に従います。
Set Breakpointを選択すると、デバッガウィンドウが開き、アプリケーションがデバッグ対象のプログラムを呼び出すのを待ちます。
Waiting for invocation of program to be debugged¶
図18:デバッグされるプログラムの呼び出しの待機</ div>
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:グローバルブレークポイントが設定されたプログラム</ div>
これで、ステップイン、ステップオーバー、続行、ローカルブレークポイントの設定など、前述の操作のいずれかを使用してプログラムをデバッグできます。プログラムの実行をステップ実行すると、呼び出し側アプリケーション(PSQL)が制御を取り戻し、select_empファンクションの実行が完了し、その出力が表示されます。
$ psql edb enterprisedb
psql.bin (14.0.0, server 14.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¶
図20:デバッガーの終了</ div>