LabTalkスクリプトのデバッグ

概要

Originには、LabTalkスクリプトの開発とデバッグに役立つさまざまなツールが用意されています。

学習する項目

このチュートリアルでは、以下の項目について解説します。

  • コードビルダを使ってLabTalkスクリプトをデバッグ
  • 便利なスキルを使ってLabTalkスクリプトをデバッグ
  • エラー処理をして中断することなくLabTalkスクリプトを実行
  • LabTalkスクリプトの優先順位の概念を理解

コードビルダを使用

*.OGSのテキストファイルのセクションにLabTalkスクリプトを保存すると、コードビルダを使用してLabTalkスクリプトをデバッグできます。

以下のサンプルでコードビルダを使ってデバッグする方法を紹介します。

  1. *.ogsファイルをコードビルダで開きます。
  2. ブレークポイントを設定する行にカーソルを置き、F9を押す(またはメニューからデバッグ: ブレークポイントの挿入/削除を選択するか、 ブレークポイントの挿入/削除ボタンButton Toggle Breakpoint new.pngをクリック)か行番号の左側の余白をクリックして、その行にブレークポイントを設定します。
    Debug LabTalk example 01.png
  3. セクションを実行します。現在のセクション名を選択するか、セクション名の行にカーソルを置き、現セクションの実行ボタンButton Execute Current Section new.pngをクリックするか、メニューからデバッグ: 現セクションの実行を選択して、指定した行までコードを実行します。また、run.sectionオブジェクトメソッドを使ってセクションを実行することもできます。
  4. ステップインボタンButton Step Into new.pngをクリック (またはF8キーを押すか、メニューからデバッグ: ステップインを選択) して、スクリプトをステップごとに実行し、論理エラーをチェックします。
    Debug LabTalk example 02.png
  5. 別のブレークポイントがある場合は、デバッグの開始ボタンButton Go new.pngをクリックして次のブレークポイントまでスクリプトを実行できます。デバッグが終了したら、デバッグの中止ボタンButton Stop Debugging new.pngをクリックしてデバッグを終了します。

LabTalk関数、LabTalkで呼び出し可能なOC関数、同じogsまたは別のogs内の別のセクションを呼び出すコマンドラインがある場合、呼び出された関数 (または呼び出されたセクションやogs) を含むコードを一度に1行ずつ実行するかどうかを選択できます。

ステップイン

ステップイン機能を使用すると、呼び出された関数をステップスルーして、関数の論理エラーをチェックできます。

  1. getminmax()関数を呼び出す行にブレークポイントを設定します。
  2. 関数呼び出しに到達するまで、コードを1行ずつ実行します。プログラムが関数呼び出し行で一時停止している間に、デバッグツールバーのステップインボタンButton Step Into new.pngをクリックするか、デバッグ:ステップインを選択します。
  3. デバッガは関数呼び出しステートメントを実行し、呼び出されたセクションの最初の行で実行を一時停止します。
    Debug LabTalk example 03.png

ステップオーバー

ただし、呼び出された関数をステップオーバーすることもできます。これを行うには、ステップオーバーする関数呼び出し行でコードの実行を一時停止します (ブレークポイントを設定するか、関数呼び出しまで一行ごとに実行)。プログラムが関数呼び出し行で一時停止している間に、デバッグツールバーのステップオーバーボタンButton Step Over new.pngをクリックするか、デバッグ:ステップオーバーを選択します。

デバッガは関数呼び出しを実行し、関数が戻った後に一時停止します。

Debug LabTalk example 04.png

ステップアウト

関数内で実行が一時停止されている場合は、デバッグツールバーのステップアウトボタンButton Step Out new.pngをクリックするか、デバッグ: ステップアウトを選択して関数からステップアウトできます。

カーソルまで実行

ルーチンを中断するブレークポイントがない場合は、カーソルまで実行ボタンButton Run to Cursor new.pngをクリックするか、 デバッグ:カーソルまで実行を選択します。カーソルが設定されている場所に到達するまでスクリプトが実行されます。

また、ed.open()メソッドを使用して、コードビルダでLabTalkスクリプトを開くことができます。たとえば、コード ビルダウィンドウの指定したセクションで指定したスクリプトファイルを開くには、次のようにスクリプトを記述します。

cd 2; //OriginのLabTalkスクリプトサンプルフォルダに切り替え
ed.open(summarize_data.ogs,main);

スキルを使用

win -o; layer -o

win -oおよびlayer -oコマンドはデバッグとは関係ありませんが、エラーの発生を回避するのに非常に役立ちます。

ワークブックやグラフページ/レイヤなどのOriginオブジェクトを操作するとき、スクリプトは常にデフォルトでアクティブウィンドウに対して行われます。ただし、アクティブなウィンドウまたはレイヤの切り替えに遅延が発生したり、予期せぬ結果を招く可能性があるため、ターゲットウィンドウをアクティブにしたくない場合があります。このような場合、win -oやlayer -oを使用してスクリプトを囲むとよいでしょう。

newbook; //新規ワークブック
//ワークブックにファイルをインポート
string fn1$=system.path.program$ + "Samples\Spectroscopy\XPS\BTABA.DAT"; 
impasc fname:=fn1$;
string mybk$=%H; //ワークブック名を保存
plotxy (1,2) o:=<new>; //グラフを作成しグラフウィンドウがアクティブに
//ワークブックウィンドウに対して中括弧で囲まれたスクリプトを実行
win -o mybk$ 
{
  newsheet;
  string fn2$=system.path.program$ + "Samples\Spectroscopy\XPS\BTATI.DAT"; 
  impasc fname:=fn2$;
  plotxy (1,2) o:=<new>;
}

type

Type を使用して、現在のディレクトリにある指定したスクリプトファイル (.OGS ファイル) の内容をコマンド (またはスクリプト) ウィンドウに出力できます。

例えば、

cd 2;
type autofit; //labtalkサンプルファイルautofot.ogsを印字

echo

デバッグとトレースを行うために、システム変数Echoはスクリプトまたはエラーメッセージをコマンドウィンドウ (またはスクリプトウィンドウ) に出力します。

たとえば、スクリプトウィンドウで次のスクリプトを実行します。

echo=1;
string aa$="abc";
double aa=100;

以下のように一般的なエラーメッセージだけでなく、エラーのあるスクリプト行も表示されます。

AA:already declared as string, cannot redeclare in the same scope!
Error:double aa=100  //The script line with error will show after runing echo=1.

エラー処理

LabTalkコードにエラーがある場合、コードはエラーの時点で中断され、エラー後の行は実行されません。スクリプトを中断せずに実行し続けたい場合は、エラーのある行を中括弧で囲むこともできます。

たとえば、次のスクリプトを実行します。

newbook name:=abc option:=lsname;
wks.ncols=3;
col(1)=data(1,10);
col(2)=normal(10);
plotxy;
win -a abc;
col(3)=col(1)+col(2);

Col(1)とCol(2)にはデータが入力されますが、入力が指定されていないため "plotxy;" 行で実行を停止します。そのためCol(3) はデータが入力されません。

以下のように中括弧を使用して"plotxy;"の行を囲みます。

newbook name:=abc option:=lsname;
wks.ncols=3;
col(1)=data(1,10);
col(2)=normal(10);
{plotxy;}
win -a abc;
col(3)=col(1)+col(2);

すると次の行が実行され、Col(3)にデータが入力されます。

エラー処理の詳細については、このページを参照してください。

LabTalkスクリプト実行の優先順位

ユーザ定義のOrigin C関数が labtalkogsファイルと同じ名前を持つ場合、labtalk ogs ファイルが優先されます。

たとえば、Origin C 関数"precedence"を作成します。

void precedence()
{
MessageBox(GetWindow(), "This message is from OC code!", "OC");
}

このOrigin C関数をコンパイルして

precedence;

スクリプトウィンドウで実行します。"This message is from OC code!"というメッセージが表示されます。

次に、ogsファイルを作成し、precedence.ogsという名前を付けて、次のスクリプトでユーザファイル フォルダに保存します。

type -b "This message is from OGS file!";

その後スクリプトウィンドウで次のスクリプトを実行します。

cd 1;  // 現在の作業ディレクトリ
precedence;

"This message is from OGS file!"というメッセージボックスが表示されます。これで、labtalkスクリプトの優先度が高いことが確認できます。