第10章 CodeScapeのスクリプトコマンド |
CodeScapeのスクリプトコマンドで、定型処理の自動化のためにMicrosoftのJScriptとVBScriptマクロのスクリプトを走らせることができます。
CodeScape用のスクリプトコマンドのサンプルとして、このドキュメント中にJScriptとVBScriptファイルを収録しました。2つのスクリプト言語のどちらでも、利用可能な関数に自分のコマンドを加えて使用してください。
JScriptとVBScriptの詳細は、「Microsoft Developer Network」のスクリプトエリアを参照してください(http://msdn.microsoft.com/scripting)。
![]() |
内容 | 文法 | ||||||||||||||||||||
特定のプログラムをロード。このコマンドはファイルのパスとファイル名をパラメータとして受け取り、ファイルをロードしたら1、それ以外は0を返す。 | LoadProgramFile(path and filename) | ||||||||||||||||||||
ターゲットプロセッサをハードリセット | HardReset() | ||||||||||||||||||||
ターゲットプロセッサをソフトリセット | SoftReset() | ||||||||||||||||||||
ターゲットプロセッサを実行 | Run() | ||||||||||||||||||||
[Script]ウィンドウにメッセージ文字列を書く | WriteMessage(string Message) | ||||||||||||||||||||
特定のレジスタに値をセット | WriteRegister(Register value,Numeric value) | ||||||||||||||||||||
特定のレジスタから値を取得 | ReadRegister(Register value) | ||||||||||||||||||||
特定の場所からバイナリファイルをロード | LoadBinaryFile(Path and filename, Numeric binary location) | ||||||||||||||||||||
特定のアドレスにブレークポイントをセット | SetBreakpoint(Numeric address) | ||||||||||||||||||||
すべてのブレークポイントを削除 | ClearAllBreakpoints() | ||||||||||||||||||||
特定のアドレスのブレークポイントを削除 | RemoveBreakpoint(Numeric address) | ||||||||||||||||||||
特定のメモリ範囲から1バイト読み込む | ReadByte(Numeric address) | ||||||||||||||||||||
特定のメモリ範囲から2バイト読み込む | ReadWord(Numeric address) | ||||||||||||||||||||
特定のメモリ範囲から4バイト読み込む | ReadLong(Numeric address) | ||||||||||||||||||||
特定のメモリ範囲に1バイト書き込む | WriteByte(Numeric address,Numeric value) | ||||||||||||||||||||
特定のメモリ範囲に2バイト書き込む | WriteWord(Numeric address,Numeric value) | ||||||||||||||||||||
特定のメモリ範囲に4バイト書き込む | WriteLong(Numeric address,Numeric value) | ||||||||||||||||||||
特定のパラメータを返す | GetParam(short param) | ||||||||||||||||||||
スクリプトを通過したパラメータの数を返す | GetParamCount() | ||||||||||||||||||||
実行中は1、そうでない場合は0を返す | IsRunning() | ||||||||||||||||||||
トレース履歴に記録するイベントを特定する
| ConfigureTraceHistory(numeric Setting, boolean Enable) | ||||||||||||||||||||
現在の履歴を[Script]ウィンドウに次のように表示
| DisplayTraceHistory() | ||||||||||||||||||||
スクリプト出力ウィンドウ内の削除 | ClearDisplay() | ||||||||||||||||||||
アドレスで与えられた型のブレークポイントを作成。成功すればブレークポイントの識別子を返し、そうでなければ0を返す。ブレークポイント識別子はブレークポイントの次の操作で使用
| CreateBreakpoint(Type, Address) | ||||||||||||||||||||
ブレークポイントの有効と無効 enable: 1:有効 0:無効 identifier: ブレークポイントの識別子 | EnableBreakpoint(identifier, boolean enable) | ||||||||||||||||||||
特定のブレークポイントの動作の有効と無効 enable: 1:有効 0:無効 identifier: ブレークポイントの識別子
| SetBreakpointActions(identifier, numeric action, boolean enable) | ||||||||||||||||||||
ブレークポイント識別子によって特定されたブレークポイント用の記録をセット breakpoint identifier: ブレークポイント識別子 expression: 記録形式 logType: false:記録しない true:条件が一致したときに記録する | SetBreakpointLog(breakpoint identifier, string expression, boolean logType) | ||||||||||||||||||||
ブレークポイントにスクリプトを付ける
identifier: ブレークポイント識別子
0:それ以外 | SetBreakpointScript(identifer, string script path, numeric script type, string script arguments, boolean prompt) | ||||||||||||||||||||
ブレークポイントの条件付き表現のセット
identifier: ブレークポイント識別子
true:条件が一致したときにトリガのカウント数を増やす
true:トリガが0になり、条件が一致した時にブレークする | SetBreakpointCondition(identifier, string expression, numeric expression type, numeric trigger count, boolean incOnTrue, boolean breakWhen) | ||||||||||||||||||||
ブレークポイントウォッチのパラメータをセット
identifier: ブレークポイント識別子
| BOOL SetWatchBreakpointParameters(Identifier, Boolean incDataCondition, string dataCondition, numeric expressionType, numeric accessSize, numeric accessType ) | ||||||||||||||||||||
ブレークポイントのマスク位置の選択
| SetBreakpointLocationMask(breakID, maskSelect) | ||||||||||||||||||||
ブレークポイントウォッチのデータマスクのセット | SetBreakpointDataMask(identifier, mask) |
数値とアドレスは次のように使用します。
![]() |
![]() |
![]() |
' This script does not do anything useful other than demonstrate the ' functions available ClearDisplay HardReset SoftReset DisplayParameters LoadSomeBinary LoadProgramFile( "d:\\projects\\maketest\\hello.elf" ) SetBreakpoint( "add_fn" ) ConfigureTraceHistory TH_LOGEXCEPT + TH_LOGSUB, true Dim Running Running = 1 Do Running = IsRunning Loop Until Running = 0 DisplayTraceHistory ReadSomeRegisters WriteSomeRegisters ReadSomeMemory WriteSomeMemory ReadSomeMemory ClearAllBreakpoints CreateCodeBP ClearAllBreakpoints CreateWatchBP WriteMessage( "Script complete. Removing all breakpoints." ) ClearAllBreakpoints ' ' Breakpoint types ' BPTYPE_CODE = 0 BPTYPE_WATCH = 1 BPTYPE_SIMSTART = 2 BPTYPE_PROFSTART = 3 BPTYPE_PROFSTOP = 4 ' ' Breakpoint Actions ' BPACTION_HALT = 0 BPACTION_ONESHOT = 1 BPACTION_PROMPT = 2 BPACTION_BEEP = 3 ' ' Breakpoint Script Types ' BPSCRIPT_JSCRIPT = 0 BPSCRIPT_VBSCRIPT = 1 ' ' Breakpoint expression types ' BPEXPR_C = 0 BPEXPR_ASSEMBLY = 1 ' ' Breakpoint address masks ' BPLOCMASK_NONE = 1 BPLOCMASK_LOW10 = 2 BPLOCMASK_LOW12 = 3 BPLOCMASK_LOW16 = 4 BPLOCMASK_LOW20 = 5 BPLOCMASK_ALL = 6 ' ' Breakpoint access sizes ' BPACCESSSIZE_ANY = 0 BPACCESSSIZE_BYTE = 1 BPACCESSSIZE_WORD = 2 BPACCESSSIZE_LONG = 4 BPACCESSSIZE_QUAD = 8 ' ' Breakpoint access types ' BPACCESSTYPE_READ = 1 BPACCESSTYPE_WRITE = 2 BPACCESSTYPE_RW = 3 ' ' Trace history configuration options ' TH_LOGEXCEPT = 8 TH_LOGSUB = 4 TH_LOGBRANCH = 2 ' ' Create a breakpoint on the 1K aligned block of memory that ' the symbol main resides in. ' Sub CreateCodeBP() Dim breakID breakID = CreateBreakpoint( BPTYPE_CODE, "main" ) SetBreakpointAction breakID, BPACTION_HALT, true SetBreakpointAction breakID, BPACTION_ONESHOT, false SetBreakpointAction breakID, BPACTION_PROMPT, false SetBreakpointAction breakID, BPACTION_BEEP, true SetBreakpointScript breakID, "e:\\projects\\codescape\\debugs\\testscript.js", BPSCRIPT_JSCRIPT, "arg1 arg2 arg3", false SetBreakpointLog breakID, "Hello John", BPEXPR_C SetBreakpointLocationMask breakID, BPLOCMASK_LOW10 setBreakpointCondition breakID, "index == 375", BPEXPR_C, 37, true, true End Sub Sub CreateWatchBP() breakID = CreateBreakpoint( BPTYPE_WATCH, "main" ) SetWatchBreakpointParameters breakID, true, "14", BPEXPR_C, BPACCESSSIZE_BYTE, BPACCESSTYPE_WRITE End Sub Sub WriteSomeRegisters() WriteRegister "fr0", 3.14159 WriteRegister "r0", "0xabcdef" WriteRegister "pc", "main + 0x30" End Sub Sub ReadSomeRegisters() WriteMessage( "Value of pc = " & ReadRegister( "pc" ) ) WriteMessage( "Value of r0 = " & ReadRegister( "r0" ) ) End Sub Sub LoadSomeBinary() LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", "201392128" LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", 201392128 LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", "0xc010000" LoadBinaryFile "d:\\projects\\codescape\\satmon.bin", "main" End Sub Sub DisplayParameters() NumParams = GetParamCount WriteMessage( "Number of parameters = " & NumParams ) For i = 1 To NumParams WriteMessage( "Parameter " & i & " = " & GetParam( i - 1 ) ) Next End Sub Sub ReadSomeMemory() WriteMessage( "Byte at main = " & ReadByte( "main" ) ) WriteMessage( "Word at main + 4 = " & ReadWord( "main + 4" ) ) WriteMessage( "Long at main + 8 = " & ReadLong( "main + 8" ) ) End Sub Sub WriteSomeMemory() WriteByte "main", 255 WriteWord "main + 4", "0xabcd" WriteLong "main + 8", "0xfedcba" End Sub
//// Note: this script does not do anything useful. It just demonstrates //// the current script commands and how they can be called. //// //// Breakpoint types //// BPTYPE_CODE = 0; BPTYPE_WATCH = 1; BPTYPE_SIMSTART = 2; BPTYPE_PROFSTART = 3; BPTYPE_PROFSTOP = 4; //// //// Breakpoint Actions //// BPACTION_HALT = 0; BPACTION_ONESHOT = 1; BPACTION_PROMPT = 2; BPACTION_BEEP = 3; //// //// Breakpoint Script Types //// BPSCRIPT_JSCRIPT = 0; BPSCRIPT_VBSCRIPT = 1; //// //// Breakpoint expression types //// BPEXPR_C = 0; BPEXPR_ASSEMBLY = 1; //// //// Breakpoint address masks //// BPLOCMASK_NONE = 1; BPLOCMASK_LOW10 = 2; BPLOCMASK_LOW12 = 3; BPLOCMASK_LOW16 = 4; BPLOCMASK_LOW20 = 5; BPLOCMASK_ALL = 6; //// //// Breakpoint access sizes //// BPACCESSSIZE_ANY = 0; BPACCESSSIZE_BYTE = 1; BPACCESSSIZE_WORD = 2; BPACCESSSIZE_LONG = 4; BPACCESSSIZE_QUAD = 8; //// //// Breakpoint access types //// BPACCESSTYPE_READ = 1; BPACCESSTYPE_WRITE = 2; BPACCESSTYPE_RW = 3; //// //// Trace history configuration options //// TH_LOGEXCEPT = 8; TH_LOGSUB = 4; TH_LOGBRANCH = 2; //// //// Create breakpoint on the 1k aligned block of memory that the symbol //// main resides in //// function CreateCodeBP() { breakID = CreateBreakpoint( BPTYPE_CODE, "main" ); SetBreakpointAction( breakID, BPACTION_HALT, true ); SetBreakpointAction( breakID, BPACTION_ONESHOT, false ); SetBreakpointAction( breakID, BPACTION_PROMPT, false ); SetBreakpointAction( breakID, BPACTION_BEEP, true ); SetBreakpointScript( breakID, "e:\\projects\\codescape\\debugs\\testscript.js", BPSCRIPT_JSCRIPT, "arg1 arg2 arg3", false ); SetBreakpointLog( breakID, "Hello John", BPEXPR_C ); SetBreakpointLocationMask( breakID, BPLOCMASK_LOW10 ); setBreakpointCondition( breakID, "index == 375", BPEXPR_C, 37, true, true ); } function CreateWatchBP() { breakID = CreateBreakpoint( BPTYPE_WATCH, "main" ); SetWatchBreakpointParameters( breakID, true, "14", BPEXPR_C, BPACCESSSIZE_BYTE, BPACCESSTYPE_WRITE ); } function WriteSomeRegisters() { WriteRegister( "fr0", 3.14159 ); WriteRegister( "r0", "0xabcdef" ); WriteRegister( "pc", "main + 0x30" ); } function ReadSomeRegisters() { WriteMessage( "Value of pc = " + ReadRegister( "pc" ) ) WriteMessage( "Value of r0 = " + ReadRegister( "r0" ) ) } function LoadSomeBinary() { LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", "201392128" ); LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", 201392128 ); LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", "0xc010000" ); LoadBinaryFile( "d:\\projects\\codescape\\satmon.bin", "main" ); } function DisplayParameters() { NumParams = GetParamCount() WriteMessage( "Number of parameters = " + NumParams ); for( i = 0; i < NumParams; i++ ) { WriteMessage( "Parameter " + i + " = " + GetParam( i - 1 ) ) } } function ReadSomeMemory() { WriteMessage( "Byte at main = " + ReadByte( "main" ) ); WriteMessage( "Word at main + 4 = " + ReadWord( "main + 4" ) ); WriteMessage( "Long at main + 8 = " + ReadLong( "main + 8" ) ); } function WriteSomeMemory() { WriteByte( "main", 255 ); WriteWord( "main + 4", "0xabcd" ); WriteLong( "main + 8", "0xfedcba" ); } ClearDisplay(); HardReset(); SoftReset(); DisplayParameters(); LoadSomeBinary(); LoadProgramFile( "d:\\projects\\maketest\\hello.elf" ); SetBreakpoint( "add_fn" ); ConfigureTraceHistory( TH_LOGEXCEPT + TH_LOGSUB, true ); Run(); while( IsRunning() != 0 ) { ; } DisplayTraceHistory(); ReadSomeRegisters(); WriteSomeRegisters(); ReadSomeMemory(); WriteSomeMemory(); ReadSomeMemory(); ClearAllBreakpoints(); CreateCodeBP(); ClearAllBreakpoints(); CreateWatchBP(); WriteMessage( "Script complete. Removing all breakpoints." ); ClearAllBreakpoints();
スクリプトを実行すると、[Input/Output]ウィンドウが自動的に表示され、現在のスクリプトによって生成されたメッセージとともに[Script]タブが表示されます。
スクリプトを実行せずに[Input/Output]ウィンドウを開くには、次のように操作してください。
![]() |
メニュー | 内容 |
Run Script | スクリプトの選択と実行 |
Clear | スクリプトタブの内容の削除 |
User Scripts | メニューにスクリプトを追加している時は、このオプションはグレーで表示されます。スクリプトを追加すると、メニューにスクリプトの名称が表示されます。 |
Allow Docking | ウィンドウのドッキングのオン/オフ |
Hide | ウィンドウを隠す |
スクリプトを追加すると、メニューバーとスクリプトタブのショートカットメニューにその名称が表示されます。メニューバーとショートカットメニューには、最大10のスクリプトファイルを追加することができます。
![]() |
![]() |