日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 部:デバッガ概要
第 1 章:デバッガ概要
第 2 部:コマンド・インタフェース
第 2 章:デバッガの起動
第 3 章:プログラム実行の制御とモニタ
第 4 章:プログラム・データの検査と操作
第 5 章:プログラム内シンボルへのアクセス制御
第 6 章:ソース・コードの表示の制御
第 7 章:画面モード
第 3 部:DECwindows インタフェース
第 8 章:DECwindows Motifインタフェースの概要
第 9 章:デバッグ・セッションの開始と終了
第 10 章:デバッガの使用方法
第 4 部:PC クライアント・インタフェース
第 11 章:デバッガの PC クライアント/サーバ・インタフェースの概要
第 5 部:高度なトピック
第 12 章:ヒープ・アナライザの使用
第 13 章:その他の便利な機能
第 14 章:特殊なデバッグ
第 15 章:マルチプロセス・プログラムのデバッグ
第 16 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引



多くのプログラムでは,プログラムがデバッガの制御下に置かれたとき, NOTATMAINメッセージが表示されます。次に例を示します。

$  DEBUG/KEEP 
            Debugger Banner and Version Number 
DBG> RUN prog-name
Language: ADA, Module: MONITOR 
Type GO to reach main program
DBG>

NOTATMAIN メッセージは,メイン・プログラムの先頭の前でプログラムが一時停止していることを知らせます。これによって,デバッガの制御下でいくつかの初期化コードを実行し,チェックすることが可能になります。

初期化コードはコンパイラによって作成され,LIB$INITIALIZE という名前の特別な PSECT に置かれます。たとえば,Ada パッケージの場合,初期化コードはパッケージ本体 ( 変数を初期化するための文を含む ) に属します。 Fortran プログラムの場合は,初期化コードは /CHECK=UNDERFLOW 修飾子または /CHECK=ALL 修飾子を指定したときに必要とされるハンドラを宣言します。

NOTATMAIN メッセージは,初期化コードをデバッグしたくない場合, GO コマンドを入力すると直ちにメイン・プログラムの先頭から実行できることを知らせます。このとき,ユーザは他のプログラムのデバッグを起動するときと同じ場面にいます。GO コマンドを再び入力すると,プログラムの実行が開始されます。

タスキング・プログラムの場合,プログラムがデバッガの制御下に置かれると,タスキング例外イベントに関連づけられた 2 つのブレークポイントが自動的に設定されます。これらのブレークポイントは, SET LANGUAGE コマンドの影響を受けません。これらのブレークポイントは,適切な実行ライブラリが存在すると,デバッガの初期化の間に自動的に設定されます。

これらの定義済みのブレークポイントを示すには,SHOW BREAKコマンドを入力します。次に例を示します。

DBG> SHOW BREAK
Predefined breakpoint on ADA event "EXCEPTION_TERMINATED" for any value 
Predefined breakpoint on ADA event "DEPENDENTS_EXCEPTION" for any value
DBG>



14.4 スタックの破損からの回復

デバッガは,起動時に一定量のメモリを割り当て,ユーザのプログラムとスタックを共有します。ユーザ・プロセスの例外により,リソースの浪費やスタックの破損が発生した場合,デバッガは制御を失うことがあり,その場合デバッグ・セッションも異常終了します。

スタック破損のメッセージや,重大なエラーについての警告が出たら,このような事態になることも考えておかなければなりません。どちらの場合も,デバッグ・セッションの完全性が保証されなくなります。

次のいずれかの手段を試してみます。

  • リソースの消費量を減らすか,スタック領域の使用量を小さくするため,ソース・コードを一時的または永続的に変更する。

  • 割り当て量を増やす。

  • プログラムのリンク時に大きなスタック・サイズを指定する。



14.5 例外ハンドラおよび条件ハンドラのデバッグ

条件ハンドラは,例外が発生した場合にオペレーティング・システムが実行するプロシージャです。

例外には,ハードウェア条件 ( 算術演算でのオーバフローやメモリ・アクセス違反など ),またはシグナル通知されたソフトウェア的な例外 ( ファイルが見つからないためにシグナル通知された例外など ) が含まれます。

オペレーティング・システムやデバッガ,またはユーザ・プログラムによって設定された種々の条件ハンドラ,たとえば,1 次ハンドラ,呼び出しフレーム・ハンドラ ( アプリケーションで宣言されたもの ) などが,どのように,またどんな順序で起動されるかは,オペレーティング・システムの規則によって指定されます。デバッガを使用する場合の条件処理については, 第 14.5.3 項 を参照してください。条件処理についての一般的な説明については,『OpenVMS Run-Time Library Routines Volume』を参照してください。

例外ハンドラおよび条件ハンドラのデバッグ・ツールには次のものがあります。

  • SET BREAK/EXCEPTION コマンドおよび SET TRACE/EXCEPTION コマンド。これらのコマンドは,ユーザ・プログラムによって発生した例外をそれぞれブレークポイントまたはトレースポイントとしてデバッガが扱うようにする。 第 14.5.1 項 および 第 14.5.2 項 を参照。

  • いくつかの組み込みシンボル (たとえば,%EXC_NAME)。これらは例外ブレークポイントおよび例外トレースポイントを修飾する。 第 14.5.4 項 を参照。

  • SET BREAK/EVENT コマンドおよび SET TRACE/EVENT コマンド。これらのコマンドは,Ada,SCAN,およびマルチスレッド・プログラムなどに固有の例外イベントでのブレークまたはトレースを行う。詳しい説明は,対応するドキュメントを参照。



14.5.1 例外へのブレークポイントまたはトレースポイントの設定

SET BREAK/EXCEPTION または SET TRACE/EXCEPTION コマンドを入力すると,デバッガはユーザ・プログラムによって作成された例外をブレークポイントまたはトレースポイントとして扱うようになります。 SET BREAK/EXCEPTION コマンドの結果,ユーザのプログラムが例外を作成した場合は,デバッガは実行を一時停止し,例外が生じたことと実行が一時停止した行を報告し,コマンド入力を要求するプロンプトを表示します。次に例を示します。

DBG> SET BREAK/EXCEPTION
DBG> GO
   .
   .
   .
%SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022 
break on exception preceding TEST\%LINE 13 
     6:         X := 3/Y;
DBG>

例外ブレークポイント ( 例外トレースポイント ) は,例外を処理するための条件ハンドラをユーザ・プログラムが持っている場合でも検出されます。 SET BREAK/EXCEPTION コマンドは,ハンドラが実行可能になる前およびその結果,例外が破棄される前にブレークポイントを発生させます。例外ブレークポイントがなければハンドラは実行され,例外を破棄するハンドラがない場合にだけ,デバッガが制御を得ることができます。 第 14.5.2 項 および 第 14.5.3 項 を参照してください。

次のコマンド行は,例外が発生した場所を示すために使用すると便利です。このコマンドを使用すると,デバッガは一連のアクティブな呼び出しと例外ブレークポイントでの PC 値を自動的に表示します。

DBG> SET BREAK/EXCEPTION DO (SET MODULE/CALLS; SHOW CALLS)

画面モードの DO 表示を作成して,デバッガが実行に割り込みをかけた場合に SHOW CALLS コマンドを実行することもできます。次に例を示します。

DBG> DISPLAY CALLS DO (SET MODULE/CALLS; SHOW CALLS)

SET TRACE/EXCEPTION コマンドで設定される例外トレースポイントは,例外ブレークポイントにアドレス式の指定を持たない GO コマンドが続くものと似ています。

例外ブレークポイントは例外トレースポイントを取り消します。また,その逆も同様です。

例外ブレークポイントまたは例外トレースポイントを取り消すには,それぞれ CANCEL BREAK/EXCEPTION コマンドまたは CANCEL TRACE/EXCEPTION コマンドを使用します。

14.5.2 例外ブレークポイントでの実行の再開

例外ブレークポイントが検出されると,アプリケーションで宣言された条件ハンドラが起動される前に実行が一時停止します。ブレークポイントから GO,STEP,または CALL の各コマンドで実行を再開する場合,動作は次のようになります。

  • GO コマンドをアドレス式のパラメータなしで入力するか,または STEP コマンドを入力すると,デバッガは例外を再シグナル通知する。GO コマンドは,アプリケーションで宣言されたハンドラがある場合,次にどのハンドラが例外を処理するかをユーザが観察できるようにする。STEP コマンドは,そのハンドラ内の命令をステップ実行する。次の例を参照。

  • GO コマンドにアドレス式のパラメータを付けて入力すると,指定した記憶位置で処理が再開され,アプリケーションで宣言されたハンドラの実行が禁止される。

  • 例外ブレークポイントでの一般的なデバッグ方法は, CALL コマンドでダンプ・ルーチンを呼び出す方法である ( 第 13 章 を参照 )。例外ブレークポイントでCALLコマンドを入力する場合,呼び出されたルーチン内で前に設定されたブレークポイント,トレースポイント,ウォッチポイントはどれもアクティブではないので,デバッガは例外コンテキストを失うことはない。ルーチンの実行後,デバッガは入力を要求する。ここでGOコマンドまたはSTEPコマンドを入力すると,デバッガは例外を再シグナル通知する。

次のFORTRANの例では,例外ブレークポイントで条件ハンドラの存在をどのようにして判断するか,また,ブレークポイントで入力されたSTEPコマンドがどのようにしてハンドラ内の命令をステップ実行するかを示しています。

例外ブレークポイントでは,SHOW CALLコマンドがSYS$QIOWルーチン呼び出しの間に例外が発生したことを知らせます。

DBG> SET BREAK/EXCEPTION
DBG> GO
   .
   .
   .
%SYSTEM-F-SSFAIL, system service failure exception, status=0000013C, PC=7FFEDE06, PSL=03C00000 
break on exception preceding SYS$QIOW+6
DBG> SHOW CALLS
module name  routine name       line       rel PC    abs PC 
              SYS$QIOW                         00000006  7FFEDE06 
*EXC$MAIN     EXC$MAIN            23      0000003B  0000063B
DBG>

VAX プロセッサでは,次のSHOW STACKコマンドは,SYS$QIOWルーチンではハンドラが宣言されていないことを示しています。呼び出しスタックの 1 レベル下で,EXC$MAINルーチンが「SSHAND」という名前のハンドラを宣言しています。

DBG> SHOW STACK
stack frame 0 (2146296644) 
    condition handler: 0 
       SPA:            0 
       S:              0 
       mask:           ^M<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11> 
       PSW:            0020 (hexadecimal) 
    saved AP:          2146296780 
    saved FP:          2146296704 
    saved PC:          EXC$MAIN\%LINE 25
   .
   .
   .
stack frame 1 (2146296704) 
    condition handler: SSHAND 
       SPA:            0 
       S:              0 
       mask:           ^M<r11> 
       PSW:            0000 (hexadecimal) 
    saved AP:          2146296780 
    saved FP:          2146296760 
    saved PC:          SHARE$DEBUG+2217
   .
   .
   .

この例外ブレークポイントでSTEPコマンドを入力すると,条件ハンドラ「SSHAND」内の命令を直接ステップ実行することができます。

DBG> STEP
stepped to routine SSHAND 
     2:        INTEGER*4 FUNCTION SSHAND (SIGARGS, MECHARGS)
DBG> SHOW CALLS
 module name  routine name    line     rel PC    abs PC 
*SSHAND       SSHAND            2    00000002  00000642 
----- 上記の条件ハンドラは例外0000045Cで呼び出された。 
%SYSTEM-F-SSFAIL, system service failure exception, status=0000013C, PC=7FFEDE06, PSL=03C00000 
----- 例外メッセージの終わり。 
              SYS$QIOW                 00000006  7FFEDE06 
*EXC$MAIN     EXC$MAIN         23      0000003B  0000063B
DBG>

デバッガは,可能な場合には条件ハンドラのアドレスを名前としてシンボル化します。ただし,ある言語では,アプリケーションで宣言された条件ハンドラが起動される前に,例外はまず実行時ライブラリ (RTL) ルーチンによって処理されるので注意が必要です。このような場合,最初の条件ハンドラのアドレスはRTL共用可能イメージのアドレスからのオフセットにシンボル化されます。

14.5.3 条件ハンドラへのデバッガの影響

プログラムをデバッガとともに実行する場合,次の条件ハンドラのうち少なくとも1つが,プログラムの実行によって発生した例外を処理するために起動されます。複数の場合は次のリストの順番に起動されます。

  1. 1次ハンドラ

  2. 2次ハンドラ

  3. 呼び出しフレーム・ハンドラ(アプリケーションで宣言される)。スタック・ハンドラとしても知られる。

  4. 最終ハンドラ

  5. ラスト・チャンス・ハンドラ

  6. キャッチオール・ハンドラ

ハンドラは,次の 3 つの状態コードのうち 1 つを「Condition Handling Facility」へ戻します。

  • SS$_RESIGNAL---オペレーティング・システムが次のハンドラを検索する。

  • SS$_CONTINUE---条件は修正されたとみなされ,実行が続けられる。

  • SS$_UNWIND---必要な場合には,呼び出しスタックはいくつかのフレームが展開され,信号が破棄される。

条件処理についてさらに詳しい説明は,『OpenVMS Programming Concepts Manual』を参照してください。

プログラムをデバッガとともに実行する場合,1次ハンドラはデバッガです。したがって,デバッガが例外を処理する最初の機会を持ちます。例外がデバッガによって引き起こされたものであるかどうかは関係ありません。

SET BREAK/EXCEPTIONコマンドまたはSET TRACE/EXCEPTIONコマンドを入力した場合,デバッガはユーザ・プログラムによって引き起こされた例外でブレーク(トレース)します。ブレーク(トレース)処理は,アプリケーションで宣言されたハンドラが起動される前に行われます。

SET BREAK/EXCEPTIONコマンドまたはSET TRACE/EXCEPTIONコマンドを入力していない場合,1次ハンドラはユーザ・プログラムによって引き起こされた例外を再シグナル通知します。

2次ハンドラは,特別な目的で使用され,本書で説明しているようなプログラムに対しては適用されません。

ユーザ・プログラムの各ルーチンで,条件ハンドラを設定することができます。これらは呼び出しフレーム・ハンドラとして知られます。オペレーティング・システムは,現在実行中のルーチンからこれらのハンドラの検索を開始します。ルーチンにハンドラが設定されていない場合,呼び出しスタックの次のルーチンによって設定されたハンドラを検索します。このようにして,必要ならばメイン・プログラムまで検索します。

呼び出しフレーム・ハンドラの起動後,ハンドラは次のうち1つの処理を行います。

  • 例外を処理し,プログラムの実行を続ける。

  • 例外を再シグナル通知する。オペレーティング・システムが呼び出しスタックの次のハンドラを検索する。

  • ブレークポイントまたはウォッチポイントを検出し,そのポイントで実行を一時停止する。

  • 自分自身で例外を作成する。この場合,1次ハンドラが再び起動される。

  • 終了する。プログラムの実行を終了する。



これらのハンドラはデバッガによって制御されます。これらのハンドラは,アプリケーションで宣言されたハンドラが例外を処理していなければ,デバッガに最終的に制御を戻し, DBG> プロンプトを表示します。そうでない場合は,デバッグ・セッションは終了し, DCLコマンド・インタプリタに制御が引き渡されます。

最終ハンドラは,呼び出しスタックの最終フレームであり,これら2つのハンドラのうち最初に起動されるハンドラです。次の例は,処理されていない例外が例外ブレークポイントから最終ハンドラに伝えられ場合,どのように処理されるかを示しています。

DBG> SET BREAK/EXCEPTION
DBG> GO
   .
   .
   .
%SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022 
break on exception preceding TEST\%LINE 13 
     6:         X := 3/Y;
DBG> GO
%SYSTEM-F-INTDIV, arithmetic trap, integer divide by zero at PC=0000066C, PSL=03C00022
DBG>

この例では,最初のINTDIVメッセージは1次ハンドラによって発行されます。2つ目のメッセージは最終ハンドラによって発行され,その後最終ハンドラによりDBG>プロンプトが表示されています。

ラスト・チャンス・ハンドラは,呼び出しスタックの破損のために最終ハンドラが制御を得ることができなかった場合にだけ起動されます。次に例を示します。

DBG> DEPOSIT %FP = 10
DBG> GO
   .
   .
   .
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=0000000A, PC=0000319C, PSL=03C00000 
%DEBUG-E-LASTCHANCE, stack exception handlers lost, re-initializing stack
DBG>

キャッチオール・ハンドラはオペレーティング・システムの一部であり,ラスト・チャンス・ハンドラが制御を得ることができなかった場合に起動されます。キャッチオール・ハンドラはレジスタのダンプを作成します。デバッガがユーザ・プログラムを制御している場合に起動されることはありません。デバッガを使用せずにプログラムを実行しているとき,プログラムでエラーが検出されると起動されます。

デバッグ・セッションの間,レジスタ・ダンプが現れ DCL レベル ($) に戻った場合は,弊社のサポート要員にご連絡ください。

14.5.4 例外関連の組み込みシンボル

例外がシグナル通知された場合,デバッガは次の例外関連の組み込みシンボルを設定します。

シンボル 説明
%EXC_FACILITY 現在の例外を発行したファシリティの名前
%EXC_NAME 現在の例外の名前
%ADAEXC_NAME 現在のAda例外の名前 (Ada プログラムの場合のみ )
%EXC_NUMBER 現在の例外の番号
%EXC_SEVERITY 現在の例外の重大度コード

これらのシンボルを次のように使用することができます。

  • 現在の例外の条件コードのフィールドに関する情報を取得する。

  • 例外ブレークポイントまたは例外トレースポイントを修飾し,ある種の例外でだけ検出されるようにする。

次に,これらのシンボルの使用例を示します。 WHEN 句の条件式は言語固有ですので注意してください。

DBG> EVALUATE %EXC_NAME
'ACCVIO'
DBG> SET TRACE/EXCEPTION WHEN (%EXC_NAME = "ACCVIO")
DBG> EVALUATE %EXC_FACILITY
'SYSTEM'
DBG> EVALUATE %EXC_NUMBER
12
DBG> EVALUATE/CONDITION_VALUE %EXC_NUMBER
%SYSTEM-F-ACCVIO, access violation, reason mask=01, virtual address=FFFFFF30, PC=00007552, PSL=03C00000
DBG> SET BREAK/EXCEPTION WHEN (%EXC_NUMBER = 12)
DBG> SET BREAK/EXCEPTION WHEN (%EXC_SEVERITY .NE. "I" .AND. %EXC_SEVERITY .NE. "S")


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.