前へ | 次へ | 目次 | 索引 |
例 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-2 と 1-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 修飾子は,デバッガの起動だけでなく,デバッグ時に提供されるシンボル情報の最大レベルにも影響しますので注意してください。
LINK コマンド修飾子 | デバッガなしの プログラム実行 |
デバッガありの プログラム実行 |
使用可能な最大シンボル 情報1 |
---|---|---|---|
/DEBUG | RUN/NODEBUG | RUN | すべて |
なしまたは /TRACEBACK または /NODEBUG2 |
RUN | RUN/DEBUG | トレースバックのみ3 |
/NOTRACEBACK | RUN | RUN/DEBUG4 | なし |
/DSF5 | RUN | DEBUG/KEEP6 | すべて |
OpenVMS Alpha システムでは,デバッガやヒープ・アナライザのようにシステム・サービス・インタセプション(SSI)を使用するものは,共有リンクによって起動されたシステム・サービス呼び出しイメージを受け取ることができません。そのためイメージを起動するプログラムは,イメージがリンクされているか /DEBUG を使って実行されている場合,共有リンクを避け,プライベート・イメージのコピーを起動するようにします。ただしこの場合,デバッガやヒープ・アナライザが制御するアプリケーションの性能に影響が現れ,共有リンクによって起動されたイメージほど高速に動作しなくなります。
1.3 保持デバッガでのプログラムのデバッグ
OpenVMS デバッガは保持デバッガで実行できます。その場合には,同じプログラムを何度も再実行することができ,また,別のプログラムを実行することもできます。そのためにデバッグ・セッションを終了する必要はありません。この節では,次の操作方法について説明します。
この項では,DCL レベル($)から保持デバッガを起動して,そのあとでプログラムをデバッガの制御下に置く方法について説明します。その他の起動方法については,第 1.6 節 および 第 1.7 節 で説明します。
第 1.3.3 項 で説明する再実行機能と 第 1.3.4 項 の実行機能を使用するには,ここで説明する方法に従って保持デバッガを起動してください。
保持デバッガを起動して,プログラムをデバッガの制御下に置くには,次の手順に従ってください。
$ DEBUG/KEEP |
デバッガが起動するとそのバナーが表示され,ユーザ定義の初期化ファイルが実行される(
第 13.2 節 を参照)。表示された DBG> プロンプトは,第 2.1 節 で説明する方法でデバッガ・コマンドを入力できるようになったことを示す。
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 |
$ 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コマンドについては,次の制限事項に注意してください。
前へ | 次へ | 目次 | 索引 |