[an error occurred while processing this directive] [an error occurred while processing this directive]


プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









コマンドラインからのデバッグ

Debug on commandline.

コマンドラインでのデバッグを行う方法をメモしておきます。

ブレークとは、作成したプログラムの動作状況を確認するために、プログラム実行中に一時停止することをいいます。 Cache'では通常、スタジオでプレークポイントをしてするなどしてスタジオからデバッグを実行しますが、コマンドラインからデバッグを実行することも出来ます。

ブレークポイントを仕掛ける

プログラムを編集できる場合は、ブレークを仕掛けたい場所でBreakコマンドを置きます。 if条件などを付けるのも簡単です。

プログラムを編集できない場合には、ブレークを仕掛ける場所をZBreakコマンドを使用して、 ZB 場所 といった形式で指定します。
ZB TEST+10:"BL+"
スタジオでのデバッグをコマンドラインで指定するイメージになります。 変数の値が変化した場合にブレークする場合もZBreak *変数名という記述で指定できます。 さらに、
ZB *var:"BL+":"$G(var)>100"
とすると、変数varが100より大の場合にのみブレークすることが出来ます。

ブレーク後の動作

 ブレークポイントを仕掛けたプログラムを動作させると、ブレーク場所で<BREAK>が発生してプログラムが停止します。 ブレーク発生後の動作は Break コマンドのパラメーターで指定します。主なパラメータとして
"C" ブレークを解除。
"L" 行単位でブレークを継続。Gotoコマンドでプログラムの実行を進めると次の行で停止します。
"S" 命令単位でブレークを継続。"L"との違いは1つの行に複数のコマンドがある場合に、"L"では次の行に進み、"S"ではその行の次の行に進むことです。
"L+" "L"の動作に加え、DoやFor等で一段深いスタックに入った場合にそのスタックでも"L+"として動作を継続します。
 "L-" 現在のスタックから抜けて呼び出し元に戻ります。呼び出し元では"L"として動作します。
 個人的によく使うのは、L,L+,L-,Cです。Sはあまり使いません。

次のブレークポイントまで進めるには、Gotoコマンドを実行します。

 

動作例

TEST() Public { //1+2+3+4+5+...
  Break
  S total=0
  For i=1:1:1000 {
     S total=total+i
     W i,!
  }
}
このようなプログラムを想定します。
このプログラムにはすでにBreakコマンドが埋め込まれています。そのためターミナルから実行した場合、Breakの場所で停止します。
USER>D TEST^test

Break
^
<BREAK>TEST+1^test
USER 2d1>
G
1
2
3
(以下略
Goto文を実行すると次のブレークポイントが定義されていないため、プログラムが最後まで実行されます。

今度はBreakで止まった後に"L"を指定してみます。
USER>D TEST^test

Break
^
<BREAK>TEST+1^test
USER 2d1>
B "L"

USER 2d1>
G

S total=0
^
<BREAK>TEST+2^test
USER 2d1>
G

For i=1:1:1000 {
^
<BREAK>TEST+3^test
USER 2d1>
G
1
2
3
(以下略
Gotoを実行するたびに一行ずつ進んでいきますが、Forの中身は一気に実行されています。

今度はBreakで止まった後に"L+"を指定してみます。
USER>D TEST^test

Break
^
<BREAK>TEST+1^test
USER 2d1>
B "L+"

USER 2d1>
G

S total=0
^
<BREAK>TEST+2^test
USER 2d1>
G

S tatal=total+i
^
<BREAK>TEST+4^test
USER 3f2>G

W i,!
^
<BREAK>TEST+5^test
USER 3f2>G
1

S tatal=total+i
^
<BREAK>TEST+4^test
Forの中身も1行ずつ実行されています。
さすがに1行ずつ進めると時間がかかるので、ZBreakを使用して変数totalが1000より大きくなった場合に止めてみます。このとき、既存のブレークをB "C"で解除するのを忘れないようにしてください。
引き続き・・・
USER 3f2>B "C"

USER 3f2>
ZB *total:"BL+":"$G(total)>1000"

USER 3f2>
G
2
3
(中略
43
44

S total=total+i
^
<BREAK>TEST+4^test
USER 3f2>W i,!,total
45
1035
iが45のとき、totalは1035になりそこでBreakが発生しました。

進めるとtotalが変更されるたびにBreakが発生します。
Breakを解除してプログラムを最後まで進めます。
引き続き・・・
USER 3f2>
B "L-"

USER 3f2>G
45

S total=total+i
^
<BREAK>TEST+4^test
USER 3f2>ZB --*total

USER 3f2>G
46
47
(以下略
より詳しく→


[an error occurred while processing this directive] [an error occurred while processing this directive]
2014/02/04Update