ダイレクト・モードでルーチンをデバッグ

特定のルーチンでデバッグセッションを開始するには、GTMプロンプトで次のコマンドをタイプしてください:

GTM>DO ^routinename

また、シェルのプロンプトでMアプリケーションを実行した後 に、<CTRL-C>キーを押してデバッグセッションを開始することができます。<CTRL-C>を押してからダイレクトモードを起動するには 、プロセスは、CENABLE状態でプリンシプル(Principal)デバイスを持ためければなりません、そして、デバイスにCTRAP=$C(3) を設定しないでください。

GT.Mが、プリンシプル(Principal)デバイスから<CTRL-C> コマンドを受け取る時は、それは、次の機会では、ダイレクトモードで起動します(通常は、次のソース行の先頭に対応するポイント)。GT.Mもまた、FORループが反復している、または、LOCK, OPEN, READなど不確定の持続期間を持つコマンドが実行している間に、割り込みをすることができます。GT.MのUSEコマンドは、[NO]CENABLEのデバイスパラメータを使って <CTRL-C>割り込みを有効または無効にします。デフォルトでは、GT.Mは<CTRL-C>を有効にします。 <CTRL-C>のデフォルト設定は、プロセス起動時に<CTRL-C>を有効にするかどうかを制御する $gtm_nocenable によって制御されます。$gtm_nocenable の値が 1, "TRUE"または "YES"(大文字小文字を区別しない)であって、プロセスのプリンシパル・デバイスがターミナルの場合、$PRINCIPAL はプロセスが<CTRL-C>をダイレクト・モードに入る信号として認識しない NOCENABLE状態に初期化されます。値がないか、$gtm_nocenable の他の値は、$PRINCIPALをCENABLE状態で初期化します。USEコマンドの [NO]CENABLE デバイスパラメータは、プロセス内からこの特性を引き続き制御できます。

GT.Mは、プリンシパルデバイス上で、GTM> プロンプトを表示します。ダイレクトモードでは、プリンシパルデバイスからコマンドを受け取り、そして、プリンシパルデバイスへエラーをレポートします。GT.Mは、他のすべてのI/Oのために、現在のデバイスを使用します。もし、GT.Mにダイレクトモードで入って、現在のデバイスがプリンシパルデバイスと一致しないならば、GT.Mはプリンシパルデバイスに警告メッセージを発行します。USEコマンドは、現在のデバイスに変更します。USEコマンドの詳細については、第9章: “入力/出力 処理 を参照してください。

GT.Mコンパイラーのデフォルトの"compile-as-written" モードは、デバッグサイクルの一部として、あなたにエラーが発生したプログラムを実行することができます。オブジェクトコードは、正しいこと、そして、最大でエラーのエラー行の上のすべてのコマンドですべての行が含まれます。GT.Mがエラーに遭遇すると、$ETRAPまたは$ZTRAPが空でない値ならば、それを実行します。デフォルトでは$ZTRAPはBREAKコマンドが含まれるので、GT.Mはダイレクトモードに入ります。

この章の残りは、デバッグプロセスを介したサンプルのルーチンである, dmex , を使ってGT.Mのデバッグ機能を示します。dmex は、名前を読み取り編集し、姓と名を出力し、もし大文字または小文字の"Q"があれば終了するようなルーチンです。

各章の残りのセクションは、GT.M.のデバッグプロセスの様相を示すために dmex を使用します。

Mルーチンの作成と表示

ルーチンを作成し編集するには、ZEDITコマンドを使います。ZEDITは環境変数EDITORで指定されるエディタを呼び出し、指定されたファイルを開きます。dmex.m を編集

例:

GTM>ZEDIT "dmex"

一度エディタを開くと、 入力しテキストを編集するために標準的な編集コマンドを使用します 。エディタを終了すると、変更を保存しダイレクトモードに戻ります。

dmex のMソースコードを表示するには、ZPRINTコマンドを使用します。

例:

GTM>ZPRINT ^dmex
dmex;dmex - Direct Mode example
;
beg  for read !,"Name: ",name do name
   quit
name set ln=$l(name)
   if ln,$extract("QUIT",1,ln)=$tr(name,"quit","QUIT") do quit
   . s name="Q"
   if ln<30,bame?1.a.1"-".a1","1" "1a.ap do print quit
   write !,"Please use last-name, "
   write "first-name middle-initial or 'Q' to Quit."
   quit
print write !,$piece(name,", ",2)," ",$piece(name,", ")
   quit
GTM>

これは、ルーチンdmex表示するにはZPRINTコマンドを使用します。

[注意] 注意

この例では bame として変数名のつづり間違いがあります。

対話形式でMルーチンを実行する

対話形式でMルーチンを実行するには、明示的なコンパイルとプログラムのリンクは必要がありません。現在のイメージの一部がなされていないMルーチンを参照する時、GT.Mは自動的にプログラムをコンパイルしZLINKしようと試みます。

例:

GTM>DO ^dmex
Name: Revere, Paul
%GTM-E-UNDEF, Undefined local variable: bame
At M source location name+3^dmex
GTM>

この例では、GT.Mはダイレクトモードで位置づけ、しかし、実行時のエラーメッセージをプログラムで発見したエラーも挙げています。この例では、定義されていないbame変数が参照されました。

エラーメッセージに関する追加情報を参照するには、$ECODEまたは$ZSTATUS特別変数を調べてください。

$ECODEは、過去のエラーの履歴を記述するコンマで区切られたコードのリストを維持する読み書きが備わっている特殊変数で、最も最近の1つをリストの末尾に表示します。$ECODEでは、標準的なエラーは、"M"が付き、ユーザ定義のエラー "U" とGT.Mエラー"Z" が接頭辞として付けられる。GT.Mコードでいつもの標準的なコードは次のとおり。

$ZSTATUSは、エラー状態のコードとルーチンが実行中に発生している最後の例外状態の場所を含んでいる文字列を維持する読み書きが備わっている特殊変数です。GT.Mは、ルーチン内で発見されたエラーだけでなく、ダイレクトモードプロンプトで入力されるエラーについて、$ZSTATUSを更新します。

[注意] 注意

$ECODEおよび$STATUSの詳細については、 第8章: “固有の特殊変数を参照してください。

例:

GTM>WRITE $ECODE
,M6,Z150373850

この例では、$ECODEを表示するためにWRITEコマンドを使用します。

例:

GTM>WRITE $ZS
150373850,name+3^dmex,%GTM-E-UNDEF, Undefined
local variable: bame

この例では、$ZSTATUSを表示するためにWRITEコマンドを使用します。$ZSTATUSコードは、$ECODEにある "Z" コードと同じであることに、注意してください。

エラーメッセージ番号を記録し、後でエラーメッセージテキストを再表示する$ ZMESSAGE関数を使用することができます。

例:

GTM>WRITE $ZM(150373850)
%GTM-E-UNDEF, Undefined local variable: !AD

この例では、前の例で発生したエラーメッセージを表示するために、WRITEコマンドと$ZMESSAGE関数を使用します。後で調べるたいと思ういくつかのエラーメッセージが生じているルーチンがある時に、$ZMESSAGE は役に立ちます。$ZMESSAGE()を使用して再表示されるエラーメッセージは汎用であり、従って、コード !AD は、元のメッセージを表示する特別な未定義のローカル変数の代わりに現れます。

ランタイムとシンタックスエラーを処理する

GT.Mがランタイムまたはシンタックスエラーが遭遇する時に、実行が停止しエラーメッセージを表示します。GT.Mは、メッセージ内のエラーを報告します。このケースでは、GT.Mは未定義のローカル変数とエラー行をレポートします、name+3^dmex。デバッギングが続行するように、GTM> プロンプトが再表示されることに、注意してください。

行を再表示しエラーを識別するために、ZPRINTコマンドを使用します。

例:

GTM>ZPRINT, name+3
%GTM-E-SPOREOL, Either a space or an end-of-line was expected but not found
ZP, name+3
^_____ 
GTM>

この例では、ダイレクトモードでZPRINTのコマンドの間違った入力の結果を示しています。GT.Mは、矢印を使ってコマンドライン上のシンタックスエラーの場所を報告します。ルーチンの実行中にGT.Mはメッセージが生成しないので、$ECODEと$ZSTATUS はこのエラーメッセージを持続しません。エラーでルーチン行を再表示するために、正しいシンタックスを入力します(すなわち、カンマを削除)。

例:

GTM>WRITE $ZPOS
name+3^dmex

この例では、現在の行の位置を書き込みます。

$ZPOSITIONは、現在行の位置と表示をする別のツールを提供する読み取り専用のGT.M特殊変数です。これは、ラベル+オフセット^ルーチン(label+offset^routine)のフォーマットで文字列として現在のエントリの参照を含み、その場所のラベルはラベルに先行して最も近いラベルです。現在の参照エントリは、ZSHOWの "S" コマンドでも表示することができる、Mの呼び出しスタックの上部に現れます。

すべての定義されたローカル変数の現在の値を表示するために、引数なしでZWRITEコマンドを使用してください。

例:

GTM>ZWRITE
ln=12
name="Revere, Paul"

このZWRITEは、現在定義されているすべてのローカル変数はのリストを表示します。

[注意] 注意

ZWRITEは変数名を表示します。ZWRITEは、bame変数の値を表示しませんし、bame変数が定義されてないことを確かめます。

エラーの修正

一時的なブレークポイントを確立しアクションを指定するZBREAKコマンドを使用してください。ZBREAKは、デバッグ時にルーチンを透過するブレークポイントを、セットまたはクリアします。このコマンドは、変数を調べ、コマンドを実行し、または、行単位でルーチン行を実行するZSTEPの使用を開始するために、特定のポイントで実行を中断することにより、デバッグを簡素化します。

GT.Mは、ZBREAKで指定されたエントリの参照が検出される時に、実行中の実行を中断します。もし、ZBREAKが "アクション(action)" 式を指定しないならば、プロセスは、デフォルト、 BREAKを使用し、ダイレクトモードへGT.Mを置きます。もし、ZBREAKが "アクション(action)" 式を指定しないならば、プロセスは "アクション(action)"の値をXECUTEs (実行)し、そして、BREAKを含むアクションがない限りダイレクトモードに入りません。アクションは、"トレースポイント(trace-point)"として供給します。アクションが端末出力を指定しない限り、トレースポイントは沈黙しています。

例:

GTM>ZBREAK name+3^dmex:"set bame=name"

これは、変数 bame が nameに等しくSETするアクションでZBREAKを使用します。

ルーチンを介して段階的に行う

ZSTEPコマンドはGT.Mの実行を指揮する強力なツールを提供します。ダイレクトモードからZSTEPを発行する時に、GT.Mは次のターゲット行の開始位置でプログラムを実行し、ZSTEPアクションを実行します。

引数の一部分のオプションのキーワードは、ZSTEPがその実行を一時停止するその場所のラインのクラスを指定し、そして、ZSTEP引数の一部分のオプションのアクションにより指定されたZSTEPアクションをXECUTEs します。もしアクションが指定されたならば、それはGT.Mコードが有効なことを評価する式である必要があります。もしアクションが指定されてない場合は、ZSTEPは、$ZSTEP 組み込み特殊変数で指定されたコードを XECUTEs します。デフォルトで$ZSTEPは、GT.Mがダイレクトモードに入るための、"B"の値を持ちます。

BREAKに続くコマンドを含むZSTEPアクションは、指定されたアクションを実行し、次にダイレクトモードに入ります。BREAKを含まないそのZSTEPアクションは、コマンドのアクションを実行し、そして、実行を継続します。条件付きBREAKsを発行するZSTEPアクションを使用してください、そして、変数の値を変化させるテストのようなタスクを実行するために引き続きZSTEPsしてください。

一つのルーチンまたは一連のルーチンを徐々に実行するZSTEPを使用してください。任意に一時停止するZSTEPで、ダイレクトモードから任意のGT.Mコマンドを実行してください。通常の実行を再開するには、ZCONTINUEを使用してください。ZSTEPの引数は式ではなくキーワードで、そして、それらは間接指定を許可しないことに、注意してください

例:

GTM>ZSTEP INTO
Break instruction encountered during ZSTEP action
At M source location print^dmex
GTM>ZSTEP OUTOF
Paul Revere
Name: Q
%GTM-I-BREAKZST, Break instruction encountered during ZSTEP action
At M source location name^dmex
GTM>ZSTEP OVER
Break instruction encountered during ZSTEP action
At M source location name+1^dmex

この例では、ルーチンdmexを介して段階的にZSTEPコマンドを使用して、未定義の変数のエラーによって中断された実行を開始していることを、示してます。ZSTEP INTOコマンドは、name+3 行を実行し、行出力の先頭で実行を中断します。

ZSTEP OUTOFは、 name 行まで実行を続けます。デフォルトであるZSTEP OVER は、Mの呼び出しスタック上でこのレベルの時点で次の行に到達するまで、実行します。この場合において、次の行は、name+1 です。ZSTEP OVER は、それらが同じ事を行う理由で、引数なしでZSTEPと置き換えることができます。

ブレークポイントから実行を続ける

ブレークポイントから実行を続行するためにZCONTINUEコマンドを使用してください。

例:

GTM>ZCONTINUE
Paul Revere
Name: q
Name: QUIT
Name: ?
Please use last-name, first name middle-initial
or 'Q' to Quit.
Name:

これは、それが中断されたポイントから実行を再開するZCONTINUEコマンドを使用します。ZBREAKアクションの結果として、bameが定義されエラーは再度発生しません。読み取られる変数nameが値として"q"を持つ時に、プロセスは意図する終了をしないので、デバッグを続行する必要があります。

実行の中断

実行を中断するために<CTRL-C>をおしてください。 プログラムのデバッグを続行するためにGTM プロンプトに戻ります。

例:

%GTM-I-CTRLC, CTRLC_C encountered.
GTM>

<CTRL-C>でダイレクトモードを呼び出します 。

デバッグでスタック呼び出しを使用

Mの DO、XECUTE、および外部関数は、スタック呼び出しにレベルを追加します。マッチング QUITは、スタックのオフ レベルとなります。GT.Mが、これらのコマンドは、外部関数、または外部特殊変数のいずれかで実行する時に、それは、スタックをオンにする新しい環境についての情報を"pushes"(プッシュ)します。GT.MがQUITを実行する時、それは、スタックをオフにする破棄された環境についての情報を"pops"(ポップ)します。その後、スタックのアクティブな末尾にすぐに到達したエントリを使用して、呼び出しルーチンの情報を復元します。

[注意] 注意

Mのスタックモデルでは、FORコマンドはスタックフレームに追加しません、そして、FORループを終了するQUITは、スタックフレームを削除しません。

ネスティングのレベルを決定する

$STACK特殊変数は、M仮想スタックの中で、DOコマンド、XECUTEコマンド、外部関数によって引き起こされる"ネスティングレベル"を示している整数値を含みます。

$STACK特殊変数は、初期値はゼロ(0)を持ち、そして、DO、XECUTE、または外部関数などで1つずつ増える値を持ちます。1つのFORループまたは全てのZGOTOコマンドを終了させない、いくつかQUIT命令は、$STACK特殊変数をデクリメントします。M標準に従い、ひとつのFORコマンドは、$STACK特殊変数を増加しません。Mルーチンは、SETやKILLコマンドで$STACK特殊変数を変更することはできません。

例:

GTM>WRITE $STACK
2
GTM>WRITE $ZLEVEL
3
GTM>

この例では、$STACK特殊変数と$ZLEVEL特殊変数の現在の値を示します。Mスタックの開始レベルとして1つ(1)を使うことを除き、$STACK特殊変数はゼロ(0)を使用することを除き、$ZLEVEL特殊変数が常に$STACK特殊変数より1つ多いことを意味していることを除いて、$ZLEVEL特殊変数は$STACK特殊変数のようなものです。"Z"コマンドと"Z"関数において$ZLEVEL特殊変数を、および、標準関数において$STACK特殊変数を使用することは、アジャストメントを計算するための要求を回避できます。

起動時にスタックを見る

$STACK固有の特殊変数と$STACK()関数は、Mスタックコンテキスト情報へアクセスするためのメカニズムを提供します。

例:

GTM>WRITE $STACK
2
GTM>WRITE $STACK(2,"ecode")
,M6,Z150373850,
GTM>WRITE $STACK(2,"place")
name+3^dmex
GTM>WRITE $STACK(2,"mcode")
if ln<30,bame?1.a.1"-".a1","1" "1a.ap do print q
GTM>

この例では、$STACK特殊変数の値を取得し、それから、$STACK()関数を使ってスタックレベルに関するさまざまな種類の情報を取得するためのその値を使用します。レベル2のエラー情報の"ecode"の値は、一つは$ZPOSITIONに似ている"place"で、もう一つは"mcode"でレベルのコードです。

$STACK固有の特殊変数に加えて、現在のスタックレベルを提供する$STACK(-1) は、$STACK()関数が有効な情報を返すための最高のレベルを与えます。それらがエラーになるまで $STACKと$STACK(-1)は同じです、しかし一度$ECODEが、それらが"current" であることを、表すと、$STACK()により返される情報はエラーの時間での状態をキャプチャするために凍結されます。; SET $ECODE=""の後に解凍されます。

例:

GTM>WRITE $STACK
2
GTM>WRITE $STACK(-1)
2
GTM>

この例では、作成された条件のもとで(上記の例で)$STACKと$STACK(-1)が同じ値を持っていることを、示しています。

$STACK() は、低レベルに関する情報を返すことができます。

例:

+1^GTM$DMOD
GTM>WRITE $STACK(1,"ecode")
GTM>WRITE $STACK(1,"place")
beg^dmex
GTM>WRITE $STACK(1,"mcode")
beg for read !,"Name:",namde do name
GTM>

そのレベルの情報の "place" と "mcode" と同様に、それらは$STACKレベル1でエラーは無かったことを、この例で表示されます。

コンテキスト情報を調べるためにZSHOWを使用

ZSHOWコマンドは、M環境に関する情報を表示します。

例:

GTM>ZSHOW "*"
$DEVICE=""
$ECODE=",M6,Z150373850,"
$ESTACK=2
$ETRAP=""
$HOROLOG="59149,36200"
    
$IO="/dev/pts/17"
$JOB=310051
    
$KEY=""
    
      $PRINCIPAL="/dev/pts/17"
    
$QUIT=0
$REFERENCE=""
$STACK=2
    
      $STORAGE=1072300032
    
$SYSTEM="47,gtm_sysid"
$TEST=1
$TLEVEL=0
$TRESTART=0
$X=0
$Y=23
$ZA=0
$ZB=$C(13)
$ZCMDLINE=""
$ZCOMPILE=""
$ZCSTATUS=0
    
      $ZDIRECTORY="/ext1/home/"
    
$ZEDITOR=0
$ZEOF=0
$ZERROR="Unprocessed $ZERROR, see $ZSTATUS"
    
      $ZGBLDIR="/ext1/home/mumps.gld"
    
$ZININTERRUPT=0
$ZINTERRUPT="IF $ZJOBEXAM()"
    
      $ZIO="/dev/pts/17"
    
$ZJOB=0
$ZLEVEL=3
$ZMODE="INTERACTIVE"
    
      $ZPOSITION="name+3^dmex"
    
$ZPROCESS=""
$ZPROMPT="GTM>"
    
      $ZROUTINES=". /usr/library/gtm_dist"
    
$ZSOURCE=""
    
      $ZSTATUS="150373850,name+3^dmex, %GTM-E-UNDEF, Undefined local variable: bame"
    
$ZSYSTEM=0
$ZTRAP="B"
    
      $ZVERSION="GT.M V4.3-001D AIX RS6000"
    
$ZYERROR=""
bame="?"
ln=12
name=""
    
/dev/pts/17 OPEN TERMINAL NOPAST NOESCA NOREADS TYPE WIDTH=80 LENG=24
name+3^dmex($ZTRAP)
         
          (Direct mode)
    
      beg^dmex
    
^GTM$DMOD(Direct mode)
GTM>

この例では、ZSHOWがこのコンテキストで提供するすべての情報を表示するためにアスタリスク(*)引数を、使用します。まず組み込み特殊変数($DEVICE-$ZYERROR, ZSHOW "I" でも使用可)、次にローカル変数(bame, ln, name, ZSHOW "V"でも使用可)、そしてZBREAKのロケーション(name+3^dmex, ZSHOW "B" でも使用可)、その後デバイスの情報(ZSHOW "D"でも使用可)、そしてMスタック(ZSHOW "S" でも使用可)。ZSHOW "S"は、引数なしがZSHOWのデフォルトです。

この例で存在しないコンテキスト情報は、このプロセス(ZSHOW "L")のM LOCKsを含みます。

現在のデバイスへのその出力を指示することに加えて、ZSHOWは、ローカルまたはグローバル変数の配列で、その出力を配置することができます。詳細については、 "ZSHow" のコマンドの説明を参照してください

[注意] 注意

ZSHOW "V" は、引数なしでZWRITEと同じ出力を生成し、しかし、ZSHOW "V" は、デバイスと同様に変数に命令することができます。

ルーチンコントロールを転送

ZGOTOコマンドは、指定されたエントリ参照を使用している、ルーチンの一部から別へまたは1つのルーチンから別へ、コントロールを転送します。ZGOTOのコマンドは、ZGOTOの実行によって達するMのスタックレベルを示すオプションの整数式と、ZGOTOがコントロールを転送するその場所を指定しているオプションのエントリー参照、を取ります。エントリー参照を持つZGOTOコマンドは、Mスタックレベルを減らす追加能力を備えたGOTOコマンドに類似する関数を実行します。1回の操作で、プロセスは、$ZLEVEL-整数式、DOまたは外部操作からの暗黙的なQUITsと、名前付きエントリ参照へ制御を転送するGOTO操作を、実行します。

ZGOTOコマンドは、整数式の値のレベルでスタック呼び出しを残します。GT.Mは、すべてに介入しているFORループを暗黙的に終了し、そして、必要に応じて、NEWコマンドでスタックされた変数をアンスタックします。

ZGOTO $ZLEVEL:LABEL^ROUTINEは、GO LABEL^ROUTINEとと同じアクションを行います。

ZGOTO $ZLEVEL-1 は、QUITと同じ結果を生成します(もしダイレクトモードでなら、ZCONTINUE続いて)。

もし整数式が、$ZLEVELの現在の値より大きい、または、0(0)未満の値で評価された場合、GT.Mはランタイムエラーを発行します。

もしZGOTOがエントリ参照を持って無いならば、それは、暗黙的QUITsのいくつかの番号を実行し、そして、指定されたレベルで次のコマンドへコントロールを転送します。引数がない時、ZGOTO 1が結果で、そして、操作は、ZSHOW "S" による表示として最下位レベルのMルーチンで再開します。mumps -directにより呼び出されるイメージ、または、似通ったイメージの中で、引数なしZGOTOは、ダイレクトモードへのプロセスを返します。

ソースコードを表示

その引数によって選択されたソースコード行を表示するためにZPRINTコマンドを使用してください。ZPRINTは、現ルーチンと他の関連するルーチンのソースを表示することができます。最後の呼び出しのレベルを表示するにはZPRINTコマンドを使用します。

例:

GTM>ZPRINT beg
beg for read !,"Name: ",name do name

この例では、スタックの最上位でのコールしとして示された行を出力するZPRINTコマンドを使用します。ルーチンはロジックのエラーがあることに注意してください。ラベルのバグを持つ開始行は、制御変数が無い、QUITが無い、GOTOが無い、FORループを持ちます。FORループの外では、ありえません。

Mルーチン内のエラーを修正

ルーチンエラーが識別されてしまった以上は、Mソースファイルのそれらを修正します。エディタを起動し編集するファイルを開き、ZEDITを使用します。前に確認したエラーを修正し、エディタを終了するために入ります。

例:

GTM>ZEDIT "dmex"
dmex;dmex - Direct Mode example
;
begfor read !,"Name: ",name do name q:name="Q"
quit
nameset ln=$l(name)
if ln,$e("QUIT",1,ln)=$tr(name,"quit","QUIT") d q
. s name="Q"
if ln<30,name?1.a.1"-".a1","1" "1a.ap do print q
write !,"Please use last-name, "
write "first-name middle-initial or 'Q' to Quit."
quit
printwrite !,$p(name,", ",2)," ",$p(name,", ")
quit
GTM>

この例では、dmex.m.のZEDITセッションの最終状態を示しています。無限FORループがある行のバグが修正されます。

編集したルーチンを再リンク

現在のイメージへ編集ルーチンを追加するために、ZLINKコマンドを使用してください。ZLINKは、自動的に再コンパイルし、ルーチンを再リンクします。もしルーチンがZEDITedまたはZLINKedの最新の1つだったならば、ZLINKコマンドでルーチン名を指定する必要はありません。

注意 注意

DOコマンドを発行する時、GT.Mは、ルーチンが現在のイメージの一部であるかどうかを、そして、コンパイルまたはリンクが必要かどうかを、決定します。このルーチンは既に現在のイメージの一部であるため、もしその最初にZLINKingせずに再度ルーチンを実行するならば、GT.Mはルーチンの編集バージョンを再コンパイルまたは再リンクしません。したがって、GT.Mは、編集ルーチンでは無く、以前のルーチンのイメージを実行します。

[注意] 注意

編集されたバージョンのZLINKingの前に、M呼び出しスタックからルーチンの未編集バージョンを削除するために、ZGOTOまたはQUITコマンドを発行すべきです。

例:

GTM>ZLINK
 Cannot ZLINK an active routine

これは、現在の呼び出しスタックの一部であるルーチンをZLINKしようとすることが原因であるGT.Mのエラーレポートを、示しています。

ルーチンをZLINKするために、コールスタックのルーチン オフにより任意の呼び出しレベルを削除します。コールスタックの現在の状態を表示するためにZSHOW "S" コマンドを使用できます。コールスタックから呼び出しから一度に1つのレベルを削除するには、QUITコマンドを使用します。コールスタックの複数のレベル オフを削除するには、ZGOTOコマンドを使用します。

例:

GTM>ZSHOW "S"
name+3^dmex ($ZTRAP) (Direct mode)
beg^dmex (Direct mode)
 ^GTM$DMOD (Direct mode)
GTM>ZGOTO
GTM>ZSHOW "S"
 ^GTM$DMOD (Direct mode)
GTM>ZLINK

この例では、コールスタックの現在の状態を表示するためにZSHOW "S" コマンドを使用します。引数なしでのZGOTOコマンドは、スタックからの最初より上で、すべての呼び出しレベルを削除します。ZLINKは、自動的に再コンパイルして再リンクし、それによって、現在のイメージへ編集ルーチンを追加します。

ルーチンを再実行する

RECALLコマンドを使用してDOコマンドを再表示します。

DOコマンドを使用してルーチンを実行します。

例:

GTM>D ^dmex
Name: Revere, Paul
Paul Revere
Name: q

この例では、dmex の実行が成功したことを、示しています。

フォーク(子)プロセスを使用

ZSYSTEMコマンドは、子プロセスと呼ばれる新しいプロセスを作成し、実行するためにシェルへその引数を渡します。新しいプロセスは、開始プロセスと同じディレクトリで実行します。新しいプロセスは、開始プロセスとして、環境変数や入力/出力デバイスのような同じオペレーティングシステムの環境 を持ちます。実行を継続する前に新しいプロセスが完了するまで、開始プロセスは一時停止します。

例:

GTM>ZSYSTEM
$ ls dmex.*
dmex.m dmex.o
$ ps
PID TTY TIME COMMAND
7946 ttyp0 0:01 sh
7953 ttyp0 0:00 gtm
7955 ttyp0 0:00 ps
$ exit
GTM>

この例では、子プロセスを作成し、いくつかのシェルアクションを実行し、そして、GT.M へ戻るようにZSYSTEMを使用します。

inserted by FC2 system