(for Internet Explorer)
← ▼ ▲
↑
g_debug_var
ReDim g_debug_var(10)
デバッグ用グローバル配列変数 g_debug_var。
デバッグが完了したら、g_debug_var を使っているコードを削除してください。
vbslib は、g_debug_var 変数を用意するだけで、アクセスしません。
ブレークする条件を満たしたことを設定するときなどに使用できます。
すべてのモジュールからアクセスすることができ、スコープを超えて通知ができます。
デバッグするときに新しく一時的なグローバル変数を作成することがよくありますが、
その度にどこに配置したらよいかを考えなくて済みます。
デバッガーを使うときは、g_debug_var にウォッチする変数を持つオブジェクトを設定
しておくことで、変数の値を表示しながらステップ実行することができます。
(src)
→ g_DebugVar (clib)
関連
サンプル
gc_NewFunction = True '//[TODO] 一時的なグローバル変数
新機能の外：
テスト対象の中の中：
If ... Then g_debug_var( 1 ) = True
:
If g_debug_var( 1 ) Then Stop
２つ目の条件を満たしたことを通知しています。
Stop する条件を満たしたことを通知しています。
テスト対象の中：
If ... Then g_debug_var( 0 ) = True
:
If g_debug_var( 0 ) Then Stop
条件付きブレークをする
補足
作成中の新機能を一時的に有効にするときは、g_debug_var を使わずに、
一時的なグローバル変数を作成してください。
新機能の中：
If gc_NewFunction Then NewFunction
← ▼ ▲
g_count, g_count_up
If g_count_up(0)=0 Then Stop '// watch-> g_count [TODO]
echo_v "g_count(0)=" & g_count(0)
If g_count_up(0)=2 Then Stop
Function g_count_up( i as integer ) as integer
グローバル配列変数 g_count の１つの配列要素の値を＋１します。
→ スルーカウンタ
【引数】
i
カウンタの種類の番号、配列要素番号（０以上）
新しい配列要素の値
返り値
デバッグ用です。 参考
問題が発生した場所の少し前でブレークさせたい場所で、まず下記のように記述します。
複数のカウンタを使うときは引数 0 を変えてください
実行させてエラーが発生した場所でブレークしたら、g_count(0) の値をウォッチします。
0 は、g_count_up の ( ) の中と同じです。 ウォッチするのは、g_count_up ではないことに
注意してください。
g_count(0) の値がウォッチした値と一致したらブレークするように、記述を変更します。
0
0
2
再び最初から実行させると、上記の Stop で止まります。
g_count(0)
← ウォッチ
← g_count(0) をウォッチしたら 2 だった場合
(src)
関連
→ スルーカウンタ (C言語 - errors)
0
→ 条件ブレーク
← ▼ ▲
特定の条件を満たしたときだけブレークしたいときは、次のように記述します。
If ... Then SetVar "Stop1", 1 '// 条件の判定 [TODO]
:
If GetVar( "Stop1" ) Then Stop '// ブレークする場所 [TODO]
条件ブレーク
← ▼ ▲
ファイル出力を開始するタイミングでブレークする
→ SetBreakByFName
出力ファイルの内容に問題があるときは、ファイル名を指定するだけで、
ファイルの出力を開始するところでブレークさせることができます。
参考
← ▼ ▲
FileWatcher
ファイルの内容をウォッチします。
ファイルの内容を、下記の順番で
テンポラリ・フォルダー
（下記 ${Tmp}）にコピーします。
StepNum_001_to_002.txt
${Tmp}\ReplaceSteps\Before
${Tmp}\ReplaceSteps\After_
フォルダー
ファイル
StepNum_001_to_002.txt
①
②
③
②
StepNum_002_to_003.txt
StepNum_002_to_003.txt
③
StepNum_003_to_004.txt
①～④ は、
関連
→ ThreeWayMergeOptionClass
.BreakStepNum
FileWatcher_copyAFileToTheLog 関数
を呼び出した回数に対応します。
初めて呼び出したときは、
Before\StepNum_001_to_002.txt
にウォッチしているファイルのコピーが作られます。 ２回目に呼び出したときは、
After_\StepNum_001_to_002.txt
にウォッチしているファイルのコピーが作られます。 ３回目に呼び出したときは、
Before\StepNum_002_to_003.txt
に、After_\StepNum_001_to_002.txt のコピーと、
After_\StepNum_002_to_003.txt
に、ウォッチしているファイルのコピーが作られます。 それ以降は、３回目に呼び出した
ときと、同様に２つのコピーが作られていきます。
よって、ファイルの内容が変化する様子を確認したいときは、Before フォルダーと After_
フォルダーを比較すればよいことになります。
ウォッチするファイルを変更するときは、
FileWatcher_setNewFile 関数
を呼び出します。
StepNum_003_to_004.txt
④
たとえば、② が付いている
After_\StepNum_001_to_002.txt
と
Before\StepNum_002_to_003.txt
の両方が、２回目に指定したファイルと同じ内容になります。
たとえば、StepNum_003_to_004.txt のファイルが最後のコピーだったときに、
FileWatcher_setNewFile 関数を呼び出したら、次に作られるコピーは、
Before\StepNum_005_to_006.txt
だけです。 StepNum_004_to_005.txt は、作られません。
拡張子は、ウォッチしているファイルと同じ拡張子になります。
FileWatcher_copyAFileToTheLog 関数を呼び出すと、標準出力に下記のように出力
します。 ただし、１回目の呼び出しでは、比較する相手がいないので、出力しません。
FileWatcher >> C:\Users\user1\AppData\Local\Temp\Report\～\ReplaceSteps
FileWatcher >> StepNum_001_to_002.txt
その関数を呼び出す前後のファイルは、比較しないようになります。
← ▼ ▲
FileWatcher_copyAFileToTheLog
Sub FileWatcher_copyAFileToTheLog( in_WatchingPath as string )
現在のファイルの内容を記録します。
ソース
→ vbslib.vbs
【引数】
in_WatchingPath
ウォッチしているファイルのパス
<< FileWatcher
← ▼ ▲
FileWatcher_setNewFile
Sub FileWatcher_setNewFile()
次に記録するファイルを、比較を開始するファイルにします。
ソース
→ vbslib.vbs
<< FileWatcher
← ▼ ▲
Test.vbs のコールバック関数を呼び出すタイミングでコールバックする
OnStart (SkipSectionGlobal)
に、デバッグ用に作成したコールバック関数を登録してください。
参考
→ テスト・プロンプト (Test.vbs)
← ▼ ▲
処理の詳細表示 (g_verbose)、トレース表示
Dim g_verbose as boolean
Verbose モードが有効かどうか。
ファイル：
vbs_inc_sub.vbs
Verbose モードが有効であるときは、内部処理の内容を詳しく表示しながら実行します。
サンプル （デバッグ時）
サンプル （開発時）
g_verbose = 1
FuncA
pause
If g_verbose Then echo_v "処理は１つも行われませんでした。"
Verbose モードで内部処理を表示する主な目的は、行われるはずの処理が行われて
いない不具合を解決することです。 処理が行われなかった
ことを中心に表示してください。 そうしないと、必要な情報が多くのノイズ（情報）に
隠れてしまいます。 とりあえず Verbose モードで動かし、そこからどの情報を詳しく
表示するようにすればいいか、どのオブジェクトを GetEchoStr で表示させるとよいか
をガイドできればよいでしょう。
関連
FuncA の処理内容を詳しく表示します。
テスト
→ T_Verbose.vbs # [T_Verbose]
→ echo_v
プログラムが処理内容に対してメタな処理になっているときに処理のステップを表示
したいときは、そのモジュールのメンバーに Verbose モードを追加してください。
← ▼ ▲
SetupDebugTools
Sub SetupDebugTools()
'--- start of parameters for vbslib include ---------
g_debug = 0 '// release:0, debug:99, -1:call SetupDebugTools
Sub SetupDebugTools() : set_input "" : SetBreakByFName Empty : End Sub
g_debug = 99 '// 上書きすることで、上記のデフォルトのコードを保護します。
Sub SetupDebugTools() '// 関数も前の定義を上書きできます。
del "C:\Users\user1\Desktop\TestData"
set_input "1."
SetBreakByFName "Out.xml"
End Sub
サンプル：
デバッグ時に main 関数を呼び出す直前で呼び出される関数。
また、この関数の中では、利便性のために
Out of Writable 警告
を発しません。
ただし、ファイルパスを指定するときは変数を使わないようにするなどして、予想外のファイル
を壊さないように注意してください。
set_input
SetBreakByFName
(src)
通常、vbslib include に、SetupDebugTools 関数の定義を記述します。
デバッグ用に何らかの設定をしたり、ファイルを初期状態に戻すなどの処理を、この関数の
中に定義してください。 main 関数の最初に記述しても同じことができますが、vbslib を
インクルードする前に、vbslib など vbs_inc でインクルードする関数が使え、g_debug の設定
の直後に処理を記述できるため、デバッグ用のコードを一般のコードと区別できます。
→ [T_SetupDebugTools] デバッガ時の初期設定
テスト
← ▼ ▲
ウォッチ (WS, WD, WX)
Sub WS2( Label as string, Value as variant )
Sub WD2( Label as string, Value as variant )
Sub WX2( Label as string, Value as variant )
Sub MARK( Label as string, out_Count as variant )
ブレークしないで、変数の値を標準出力へ表示します。
スレッドの通過を表示します
文字列値を表示します
数値を表示します
数値を16進数で表示します
<WATCH label="var1" value="123"/>
出力例：
サンプル：
Dim var1 : var1 = 123
WD2 "var1", var1
Dim var1 : var1 = 123
Execute WD("var1")
Function WD( Expression as string ) as string
Function WS( Expression as string ) as string
Function WX( Expression as string ) as string
数値を16進数で表示するコードを返します
数値を表示するコードを返します
文字列値を表示するコードを返します
(src)
MARK "a", 0
関連
→ Execute_Echo
g_debug_var
デバッガーを使うときは、
にウォッチする変数を持つオブジェクトを設定しておくことで、
変数の値を表示しながらステップ実行することができます。
→ バイナリーデータをダンプ表示する
← ▼ ▲
エラー処理のデバッグ
エラーが発生した後の処理を、デバッグする方法を示します。
→ エラーが発生した瞬間のスクリプト内部の様子を調べる
まず、エラーが発生した瞬間を捕らえて、その場所に Stop 命令を記述します。
参考
→ ソース・ファイルの中の任意の場所でブレーク（一時停止）する
… Stop 命令
g_debug
を 99 など大きな数に設定して起動します。
Stop したら、ステップ実行します。
1.
2.
3.
← ▼ ▲
データの元を探す
"<OneFile name="""+ one_element +"""/>"
For Each one_element In module.Delegate.Elements
Set module = element.OutModuleTypes.Item(k)
Set element = find_.OutElements.Item( element_name )
Set find_ = new
(.txt)
as CrossFind_OutElementClass
↑CrossFind_ModuleClass
(.txt)
(.txt)
array of string
CrossFindClass
データのインデックスを探す
echo_v "333=> element_name = "+ GetEchoStr( element_name )
echo_v "222=> k = "+ GetEchoStr( k )
echo_v "111=> kk = "+ GetEchoStr( kk )
kk = kk + 1
この色の文字
kk = 0
で書かれたデバッグ用コードを入れて、データのインデックスを探す。
1.
データを格納する場所（複数）は、変数名を単語単位で全文検索すれば分かることが多いです。
多くヒットしてしまうときは、クラス名で絞り込むか、データの値を print/echo して絞り込んでください。
Set g_debug_var(9) = root_object
echo_v "999=> "+ g_debug_var(9).OutElements( "1.c" ).OutModuleTypes(1).Delegate.Elements(2)
2.
インデックスを入れた、データ構造のルート（下記の find_ ）からたどるコードを書く
上記は、VBScript のコードです。
… 辞書のキー
… 配列番号
… For Each から
配列番号
↑辞書のキー
↑配列番号
↑
配列番号
また、データをどこのコードでも参照できるように、下記のように、調べるデータをルートからたどるための
インデックスを調べておくとよいでしょう。
データに関するデバッグは、そのデータを計算するときの入力データと、計算内容を確認することです。
入力データの入力データもあります。 最も元となる入力データからのツリー構造になります。
プログラムは、大量のデータのすべてに関して、元に近いほうから計算（処理）することです。
フロー
データA
データB
データC
データD (NG)
フロー
確認する
確認する
← ▲
デバッグ用一時コードのテンプレート
echo_v new_BinaryArrayAsText( "漢字", Empty ).xml
If InStr( Name, "value" ) >= 1 Then Stop:OrError '// TODO:
echo_v "111=> variable = "+ GetEchoStr( variable )
'//■ TODO: Coding of ***********
echo_v "111=>"
If g_count_up(0)=0 Then Stop:OrError '// TODO:
echo_v "g_count(0)=" & g_count(0)
Stop:OrError '// TODO:***********
Array _
0 : Skipped
Skipped : If False Then
End If
変数の値を表示する。 特にループの中。
→ デバッガー
多くの変数値を見るときは、
下記のコードをすぐに開ける場所に置いておけば、デバッグ時にコピーするだけで
デバッグに必要な情報を集めることができるようになります。
必要なら赤字の部分を変更してください。
111
variable
variable
CPU がこの経路を通過したこと、処理が行われたことを表示する。
111
InStr( Name, "value" ) >= 1
指定の条件を満たしたときに、ブレークする。
g_count_up
指定した回数を通過したときに、ブレークする。
バイナリーをダンプする。
"漢字"
→ データの元を探す
ブレークする。
OrError
echo_v
GetEchoStr
現在編集中の場所を強調表示する。 未確定のコードであることを示す。
処理をスキップする。 主にテスト プログラム用。
配列形式のデータをスキップする。
スキップするデータを Array _ の行と 0 : Skipped の行の間に、
一時的に移動します。 このコードは、何も処理が行われません。
DicTable
でよく使われます。
スキップする処理を If ～ End If で挟みます。