Compaq OpenVMS
デバッガ説明書


前へ 次へ 目次 索引


1.2.1 デバッグのためのプログラムのコンパイル

例 1-1 では,FORMS.C と INVENTORY.C という 2 つのソース・モジュールにより構成されているデバッグのための C プログラム,FORMS.EXE のコンパイル方法を示しています。FORMS.C はメイン・プログラム・モジュールです。

例 1-1 /DEBUG 修飾子によるプログラムのコンパイル

$ CC/DEBUG/NOOPTIMIZE INVENTORY,FORMS

言語によっては,/DEBUG 修飾子や /NOOPTIMIZE 修飾子をコンパイラ・コマンドの省略時設定にしているものもあることに注意してください。この例では強調のためにこれらの修飾子を使用しています。特定の言語固有のコンパイルとリンクについては,各言語とともに提供されるドキュメントを参照してください。

例 1-1 のコンパイラ・コマンドに指定した /DEBUG 修飾子は,オブジェクト・モジュール FORMS.OBJ と INVENTORY.OBJ で,FORMS.C と INVENTORY.C に関連付けられたシンボル情報を含むようにコンパイラに要求します。このようにすると,プログラムをデバッグしているときに,変数やルーチン,他の宣言されたシンボルのシンボル名を参照できます。シンボル情報は,/DEBUG 修飾子を使用して作成されたオブジェクト・ファイルにだけ格納されます。すべてのシンボル情報を含むのか,プログラムの流れをトレースすることだけが必要なのかは,ユーザが制御できます(第 5.1.1 項 を参照)。

一部のコンパイラでは,オブジェクト・コードを最適化して,プログラムのサイズを小さくしたり,実行速度を向上できます。しかし,このようにすると,オブジェクト・コードは必ずしもソース・コードと対応しなくなり,その結果,デバッグが困難になります。この状況を回避するには,/NOOPTIMIZE コマンド修飾子(またはそれに相当する機能)を使用して,プログラムをコンパイルします。最適化されていないプログラムをデバッグした後,今度は /NOOPTIMIZE 修飾子を指定せずにプログラムを再コンパイルし,テストできます。このようにすると,最適化機能を利用できます。最適化の効果については,第 14.1 節 を参照してください。

1.2.2 デバッグのためのプログラムのリンク

例 1-2 は,FORMS.EXE という C プログラムをリンクする方法を示しています。このプログラムは FORMS.C と INVENTORY.C という 2 つのソース・モジュールで構成されます。FORMS.C はメイン・プログラム・モジュールです。どちらのソース・モジュールも /DEBUG 修飾子を使用してコンパイルされています( 例 1-1 を参照)。

例 1-2 /DEBUG 修飾子を使用したプログラムのリンク

$ LINK/DEBUG FORMS,INVENTORY 

VAX プロセッサでは,LINK コマンドにリンカ・オプション・ファイルを指定できます(必要な場合)。 例 1-3 では,/OPTIONS 修飾子は,OPTIONS_FILE がリンカ・オプション・ファイルであることを示しています。

例 1-3 /OPTIONS_FILE 修飾子を使用したプログラムのリンク(VAX のみ)

$ LINK/DEBUG FORMS,INVENTORY,OPTIONS_FILE/OPTIONS 

1-21-3 では,LINK コマンドの /DEBUG 修飾子は,リンクされているオブジェクト・モジュールに含まれているすべてのシンボル情報を実行可能イメージに含むようにリンカに要求します。大部分の言語では,インクルードするすべてのオブジェクト・モジュールを LINK コマンドに指定しなければなりません。LINK コマンドを使用してシンボル情報を制御する方法については,第 5.1.3 項 を参照してください。

Alpha システムでは,/DSF 修飾子を使用してリンクされたプログラムをデバッグできるようになりました(したがって,別のデバッグ・シンボル・ファイルが作成されます)。LINK コマンドに /DSF 修飾子を指定すると,リンカはシンボル情報を格納するために別の .DSF ファイルを作成します。このため,これまでより柔軟なデバッグ・オプションを選択できます。このようなプログラムをデバッグするには,次のことが必要です。

次の例を参照してください。


$ CC/DEBUG/NOOPTIMIZE TESTPROGRAM
$ LINK/DSF=TESTDISK:[TESTDIR]TESTPROGRAM.DSF TESTPROGRAM
$ DEFINE DBG$IMAGE_DSF_PATH TESTDISK:[TESTDIR]
$ DEBUG/KEEP TESTPROGRAM

個別のシンボル・ファイルがあるプログラムのデバッグの詳細については,第 5.1.5 項 を参照してください。/DSF 修飾子の使い方については,『OpenVMS Linker Utility Manual』を参照してください。

1.2.3 LINKコマンドとRUNコマンドによるデバッガ起動の制御

実行可能なイメージにシンボル情報が渡されることに加え,LINK/DEBUG コマンドを使用すると,作成されたイメージを DCL の RUN コマンドで実行する場合,イメージ・アクティベータがデバッガを起動します。(この起動方法については,第 1.6 節 を参照してください。)

コマンド修飾子 /DEBUG を使用してイメージのコンパイルとリンクを行った場合でも,そのイメージをデバッガの制御下に置かずに通常どおりに実行することができます。それには DCL の RUN コマンドで /NODEBUG 修飾子を使用してください。次に例を示します。


$ RUN/NODEBUG FORMS

エラーがないと思われる場合は,この方法で簡単にプログラムをチェックすることができます。デバッガが必要とするデータは実行可能なイメージ内の領域を占有しますので,プログラムが正常であると考えられるときは /DEBUG 修飾子を使用しないで,もう一度プログラムをリンクしてください。その結果,デバッグ・シンボル・テーブルにトレースバック・データだけを持ったイメージが作成され,使用するディスク領域を節約することができます。

LINK コマンドと RUN コマンドの修飾子でデバッガの起動を制御する方法を 表 1-1 に要約します。LINK コマンドの /[NO]DEBUG 修飾子と /[NO]TRACEBACK 修飾子は,デバッガの起動だけでなく,デバッグ時に提供されるシンボル情報の最大レベルにも影響しますので注意してください。

表 1-1 LINKコマンドとRUNコマンドによるデバッガ起動の制御
LINK コマンド修飾子 デバッガなしの
プログラム実行
デバッガありの
プログラム実行
使用可能な最大シンボル
情報1
/DEBUG RUN/NODEBUG RUN すべて
なしまたは
/TRACEBACK または
/NODEBUG2
RUN RUN/DEBUG トレースバックのみ3
/NOTRACEBACK RUN RUN/DEBUG4 なし
/DSF5 RUN DEBUG/KEEP6 すべて


1COMPILE コマンドの修飾子と LINK コマンドの修飾子の両方でデバッグを制御しているときに使用可能なシンボル情報のレベル(第 5.1 節 を参照)。
2LINK/TRACEBACK(または LINK/NODEBUG)は LINK コマンドの省略時設定です。
3トレースバック情報には,コンパイラ生成行番号,ルーチン名,モジュール(コンパイル単位)名が含まれます。このシンボル情報は,実行時エラーが起きたときに(実行を一時停止した地点の)PC 値とアクティブな呼び出しを示すために,トレースバック条件ハンドラが使用します。デバッガの SHOW CALLS コマンドもシンボル情報を使用します(第 2.3.3 項 を参照)。
4RUN/DEBUG コマンドでデバッガを実行することはできますが,LINK/NOTRACEBACK コマンドを実行しているとシンボリック・デバッグを行うことはできません。
5Alpha のみ
6論理名 DBG$DSF_IMAGE_NAME は,.DSF ファイルを格納するディレクトリを指さなければなりません( 第 1.2.2 項 を参照)。

OpenVMS Alpha システムでは,デバッガやヒープ・アナライザのようにシステム・サービス・インタセプション(SSI)を使用するものは,共有リンクによって起動されたシステム・サービス呼び出しイメージを受け取ることができません。そのためイメージを起動するプログラムは,イメージがリンクされているか /DEBUG を使って実行されている場合,共有リンクを避け,プライベート・イメージのコピーを起動するようにします。ただしこの場合,デバッガやヒープ・アナライザが制御するアプリケーションの性能に影響が現れ,共有リンクによって起動されたイメージほど高速に動作しなくなります。

1.3 保持デバッガでのプログラムのデバッグ

OpenVMS デバッガは保持デバッガで実行できます。その場合には,同じプログラムを何度も再実行することができ,また,別のプログラムを実行することもできます。そのためにデバッグ・セッションを終了する必要はありません。この節では,次の操作方法について説明します。

1.3.1 保持デバッガの起動

この項では,DCL レベル($)から保持デバッガを起動して,そのあとでプログラムをデバッガの制御下に置く方法について説明します。その他の起動方法については,第 1.6 節 および 第 1.7 節 で説明します。

第 1.3.3 項 で説明する再実行機能と 第 1.3.4 項 の実行機能を使用するには,ここで説明する方法に従って保持デバッガを起動してください。

注意

次の問題点または制限事項は保持デバッガ固有のものです。

  • 前に実行したデバッガ・プロセスが完全に停止されていない場合には,デバッガを起動するときに,次のエラーが表示されることがある。


    %DEBUG-E-INTERR, internal debugger error in 
       DBGMRPC\DBG$WAIT_FOR_EVENT got an ACK 
    


    この問題に対処するには,デバッガを終了する。その後,DCL の SHOW PROCESS/SUBPROCESS コマンドを使用して,デバッガ・サブプロセスが終了したかどうか確認する。終了している場合には,DCL の STOP コマンドを使用して停止した後,デバッガを再起動する。

  • サイズの大きい一連のプログラムを実行すると,メモリやグローバル・セクション,あるいは他のリソースがすべて使用されてしまうため,デバッガが異常終了することがある。

    この問題を解決するには,デバッガを終了した後,デバッガ・セッションを再起動する。

保持デバッガを起動して,プログラムをデバッガの制御下に置くには,次の手順に従ってください。

  1. 第 1.2 節 の説明どおりにプログラムをコンパイルおよびリンクしたことを確認する。

  2. 次のコマンド行を入力する。


    $  DEBUG/KEEP 
    


    デバッガが起動するとそのバナーが表示され,ユーザ定義の初期化ファイルが実行される( 第 13.2 節 を参照)。表示された DBG> プロンプトは,第 2.1 節 で説明する方法でデバッガ・コマンドを入力できるようになったことを示す。

  3. デバッガの RUN コマンドを使用してユーザ・プログラムをデバッガの制御下に置く。RUN コマンドには,ユーザ・プログラムの実行可能なイメージをパラメータとして指定する。次に例を示す。


    DBG> RUN FORMS
    Language: C, Module: FORMS
    DBG> 
    

表示されているメッセージは,このデバッガ・セッションがCプログラム用に初期化されており,メイン・プログラム単位(イメージ遷移アドレスを持ったモジュール)の名前がFORMSであることを示しています。初期化によって言語固有のデバッガ・パラメータが設定されます。これらのパラメータは,デバッガが名前や式を解析する方法や,デバッガの出力の書式などを制御します。言語固有のパラメータについての詳しい説明は,第 4.1.9 項 を参照してください。

メイン・プログラム・ユニットを起動するときや,特定のプログラムで何らかの初期化コードを起動するときに,(一時的なブレークポイントを設定することにより)デバッガはプログラムの実行を中断します。その場合,デバッガは次のメッセージを表示します。


Type GO to reach main program

これらのプログラム(たとえば Ada プログラム)では,一時的なブレークポイントで完全なシンボル情報を使用して,初期化コードをデバッグすることができます。詳細については,第 14.3 節 を参照してください。

第 2 章 で説明されているように,これでプログラムをデバッグすることができます。

◆引数が必要なプログラムのRUNおよびRERUNコマンド・オプション

プログラムによっては,引数が必要なものもあります。この節では,デバッガの RUN コマンドと RERUN コマンドの使用方法,および /ARGUMENTS 修飾子と /COMMAND 修飾子でデバッガ制御を行う場合に,このようなプログラムを実行する方法について説明します。

保持デバッガでデバッガを起動した後,RUN コマンドにイメージ名を入力するか,または RUN/COMMAND コマンドと DCL フォーリン・コマンドを使用して,デバッグするイメージを指定できます。DCL フォーリン・コマンドを指定するには,RUN コマンドの /COMMAND 修飾子を使用します。

RUN コマンドと RERUN コマンドの /ARGUMENTS 修飾子には,引数リストを指定できます。

次のデバッガ・セッションの例には,複数の方法が示されています。デバッグするプログラムは echoargs.c であり,入力引数を端末に表示するプログラムです。


#include <stdio.h> 
 
main(int argc, char *argv[])
{ 
  int i; 
 
 
  for(i = 0; i < argc; i++)
    printf("%s\n", argv[i]); 
} 

このプログラムを,次のようにコンパイル,リンクします。


$ cc/debug/noopt echoargs.c
$ link/debug echoargs

DCLフォーリン・コマンドは,次のように定義します。


$ ECHO == "$ sys$disk:[]echoargs.exe"

保持デバッガを起動します。次の例のデバッガ・セッションでは,引数を渡す方法として 3 種類の方法を紹介しています。

◆/COMMAND と /ARGUMENTS を指定した RUN
デバッガ・セッションのこのセクションでは,デバッガの RUN コマンドに /COMMAND 修飾子と /ARGUMENTS 修飾子を指定する方法について説明します。 /COMMAND 修飾子は,DCL フォーリン・コマンド echo を指定します。/ARGUMENTS 修飾子は引数 fa sol la mi を指定します。最初の GO コマンドは echoargs.exe の初期化コードを実行します。その後,デバッガはプログラムの起動時に一時的なブレークポイントでプログラムの実行を中断します。2 番目の GO コマンドは echoargs.exe を実行します。これは引数を画面に正しく表示します。


$ debug/keep
      Debugger Banner and Version Number 
DBG> run /command="echo"/arguments="fa sol la mi"
Language: C, Module: ECHOARGS 
Type GO to reach main program
DBG> go
break at routine ECHOARGS\main 
   265: {
DBG> go
_dsa1:[jones.test]echoargs.exe;2 
fa 
sol 
la 
mi 
'Normal successful completion'

◆/ARGUMENTS を指定した RERUN
デバッガ・セッションのこのセクションでは,RERUN コマンドの /ARGUMENTS 修飾子を使用して,新しい引数 fee fii foo fum によって同じイメージを再実行する方法を示します(/ARGUMENTS 修飾子を指定しなかった場合には,デバッガは前に使用した引数を使用してプログラムを再実行します)。

最初の GO コマンドは echoargs.exe の初期化コードを実行します。そのあと,デバッガはプログラムの起動時に一時的なブレークポイントでプログラムの実行を中断します。2 番目の GO コマンドは echoargs.exe を実行します。これは引数を画面に正しく表示します。


DBG> rerun/arg="fee fii foo fum"
Language: C, Module: ECHOARGS 
Type GO to reach main program
DBG> go
break at routine ECHOARGS\main 
   265: {
DBG> go
_dsa1:[jones.test]echoargs.exe;2 
fee 
fii 
foo 
fum 
'Normal successful completion'

◆/ARGUMENTS とイメージ名を指定した RUN
デバッガ・セッションのこのセクションでは,RUN コマンドを使用して echoargs の新しいイメージを起動し,/ARGUMENTS 修飾子を使用して引数 a b c を指定します。

最初の GO コマンドは echoargs.exe の初期化コードを実行します。そのあと,デバッガはプログラムの起動時に一時的なブレークポイントでプログラムの実行を中断します。2 番目の GO コマンドは echoargs.exe を実行します。これは引数を画面に正しく表示します。


DBG> run/arg="a b c" echoargs
Language: C, Module: ECHOARGS 
Type GO to reach main program
DBG> go
break at routine ECHOARGS\main 
   265: {
DBG> go
_dsa1:[jones.test]echoargs.exe;2 
a 
b 
c 
'Normal successful completion'
DBG> quit

◆RUNコマンドの制限事項

デバッガのRUNコマンドについては,次の制限事項に注意してください。


前へ 次へ 目次 索引