日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V7.3-2
ライブラリ

タイトルページ
目次
まえがき
第 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 章:ベクタ化されたプログラムのデバッグ
第 17 章:タスキング・プログラムのデバッグ
第 6 部:付録
付録 A :定義済みのキー機能
付録 B :組み込みシンボルと論理名
付録 C :各言語に対するデバッガ・サポートの要約
付録 D :EIGHTQUEENS.C
索引
PDF
OpenVMS ホーム

HP OpenVMS
デバッガ説明書


目次 索引



配列要素やレコード構成要素 ( 適用できる場合 ) を表す文法は,言語によって異なります。

たとえば,ある言語では配列要素を区切るために大括弧 ([]) を使用し,別の言語では括弧 (( )) を使用します。

ある言語ではゼロを基底とする配列を持ち,また別の言語では,次の例のように1を基底とする配列を持ちます。


DBG> EXAMINE INTEGER_ARRAY
PROG2\INTEGER_ARRAY 
   (1,1):       27 
   (1,2):       31 
   (1,3):       12 
   (2,1):       15 
   (2,2):       22 
   (2,3):       18
DBG>

ある言語 ( Pascal や Ada など ) では,特定の配列宣言によって配列が何を基底にするかが決まります。

C 言語では,名前や言語式の大文字/小文字が区別されます。名前や言語式を指定する場合,ソース・コードに記述されているとおりに指定しなければなりません。たとえば,言語が C に設定されているとき,次の 2 つのコマンドは等しくありません。


DBG> SET BREAK SCREEN_IO\%LINE 10
DBG> SET BREAK screen_io\%LINE 10



多くのプログラムでは,プログラムがデバッガの制御下に置かれたとき, 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>



VAX システムでは,STEP/OVER コマンドを使用すると,Fortran 実行時ライブラリ ( RTL ) ルーチンを飛び越さずに,その中でステップ実行することがあります。Fortran プログラムをデバッグしているときに,READ,WRITE,PRINT などの Fortran 入出力操作が見つかった場合,Fortran コンパイラは,Fortran RTL ルーチンを呼び出し,入出力操作を終了させます。RTL ルーチンを呼び出すときSTEPコマンドを使用すると,デバッガはこのルーチンを飛び越さずにその中でステップ実行し,次のエラー・メッセージを表示します。


%DEBUG-W-NOSCRLIN, no source line for address nnnnnnnn 

通常デバッガは,次に実行するRET命令を探すことによってルーチンを飛び越しますが,Fortran コンパイラは,明示的に RET 命令を実行せずに,標準的でない方法を使用して,Fortran RTL 入出力ルーチンで使用されている一時文字列の割り当てをスタックから解除します。これがその原因になります。

エラー・メッセージから回復するときは,STEP コマンドを何度か出して,セッション内の希望するコード行に戻ります。問題の再発を防ぐために,プログラムを変更して,入出力文の前に,関数の結果を格納する一時変数を含むように書き換えます。たとえば次のようにします。


    CHARACTER*23 c1, c2 
    c1 = c2()                   ! c1 is the temporary variable 
    WRITE (*) c1 
    END 
C 
    CHARACTER*23 FUNCTION c2() 
    c2 = 'ABCDEFGHIJKLMNOPQRSTUVW' 
    RETURN 
    END 



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次ハンドラが再び起動される。

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


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項