Title: デバッグ

top秀丸エディタマクロマクロ作成関連

update : 2016/09/06 (Tue)

1 マクロのデバッグ方法について

マクロのデバッグ方法はとしては、message 文を使う方法があります。

お手軽ですが「OK」を押すのが結構面倒です。特にループ内で使うと結構疲れます。

という事で、"debuginfo"命令とデバッグツールの DBCon を使用したデバッグ方法を紹介します。

1.1 debuginfoとDBCon使ったデバッグ方法

"debuginfo" は引数をデバッグツール(ここではDBCon)に出力します。 注意しなければいけないのは初期状態ではデバッグツールへの出力が禁止されている為、 最初に出力を許可する必要があります。 出力を許可するには"debuginfo"に"0"以外の数字を数値を指定します。

debuginfo 1;

あとはマクロで、

debuginfo "これは実験です。";

という一文をいれておけば、デバッグツールに出力されます。

debuginfoの詳細はマクロのヘルプ debuginfo文を、 参照して下さい。

例)

debuginfo 1;
$ret = input("数字を入力して下さい。","");
debuginfo "入力されたのは " + $ret +"です。\n";
endmacro;

というマクロを実行すると、DBConには以下のように出力されます。 (数字はinput命令で入力した値。)

[デバッグ画面]

ここで公開しているマクロは先頭に

//デバッグ時は、以下の2行のコメントを外すこと
debuginfo 1;  //デバッグ出力許可
#debug = 1;   //デバッグフラグ

の3行を入れて、サブルーチンとして、

DBOUT:
    if(#debug == 1 && findwindowclass("DBConClass") != 0) debuginfo $$1 + "\n";
return;

を入れて、必要に応じてサブルーチンコールし、DBConに出力しています。

call DBOUT "出力したい文字列"

サブルーチンでfindwindowclass命令を使っているのはDBConが起動していることを確認しているためです。 デバッグ出力を有効にしても、DBConが起動していないと出力しないようにしています。

デバッグしない場合は、

debuginfo 1;
#debug = 1;

をコメントにすればDBConに出力しません。 それと、call命令があると実際には何もしない不要なサブルーチンコールをすることになるので、

call DBOUT "出力したい文字列"

もコメントにしています。

手作業でコメント・コメント解除するのは面倒なので、実際にはコメントon/offするマクロを作成し、 それを使っています。

1.2 秀丸自体を使ったデバッグ方法

単純に秀丸を新たに開いて、出力しているだけです。 これなら、OSを問いません。が、秀丸をパタパタと切り換えるので、鬱陶しいかもしれません。 タブモードで使っている人は、新規のタブグループを開くようにしたほうがいいかな?

//初期設定
#dbout_hidemaru = 0;
#debug = 1;
call DBOUT2 "実験です!";
endmacro;
//
DBOUT2:
  ##main = hidemaruhandle(0);
  if(#debug == 1){
    if(#dbout_hidemaru == 0){
      ##ret = findhidemaru("Hidemaru_Macro_Debug_Output_Window");
      if(##ret == -1){
        openfile "/i";
        changename "Hidemaru_Macro_Debug_Output_Window";
        #dbout_hidemaru = hidemaruhandle(0);
      }else{
        #dbout_hidemaru = ##ret;
      }
    }
    setactivehidemaru(#dbout_hidemaru);
    gofileend;
    insert "[" + time + "] " + $$1 + "\n";
    setactivehidemaru(##main);
  }
return;

1.3 秀丸自体を使ったデバッグ方法その2

Ver.8β24

Ver.8から、アウトプット枠が追加されています。そこに、デバッグメッセージを表示します。

#debug = 1;

1行目がデバッグ用のフラグです。

call DBOUT_INIT;

2行目がアウトプット枠の初期化(?)を行っています。

デバッグツールが不要ですが、秀丸エディタが異常終了するような場合は、ログも一緒になくなります。

また、"dllfunc" を使用している為、ウィンドウ(タブ)を切り替えるマクロの場合、エラーが発生する場合もあります。 (「DLLがロードされていないのにdllfunc関数が使われました」と表示される場合がある。 現時点(2013/06/09)では仕様。DLLの有効範囲を参照)

//デバック時は、以下の2行のコメントを外すこと
#debug = 1;
call DBOUT_INIT;
call DBOUT "デバッグ出力!!:" + time;
endmacro;
//----------------------//
//  デバック出力ルーチン
//----------------------//
DBOUT:
    if(#debug == 1 && #Debug_OutputPanel > 0){
        ##n = dllfunc(#Debug_OutputPanel, "Output", hidemaruhandle(0), $$1 + "\n");
    }
return;
//初期化
DBOUT_INIT:
    #Debug_OutputPanel = loaddll("HmOutputPane.dll");
    if(#Debug_OutputPanel == 0){
        #debug = 0;
        return;
    }
    //非表示の場合は表示する。
    ##outputhandle = dllfunc(#Debug_OutputPanel, "GetWindowHandle", hidemaruhandle(0));
    if(##outputhandle == 0){
        ##n = dllfunc(#Debug_OutputPanel, "Output", hidemaruhandle(0), "");
        setfocus 1;
        ##outputhandle = dllfunc(#Debug_OutputPanel, "GetWindowHandle", hidemaruhandle(0));
    }
    //クリアする場合は有効にする。
    ##ret = sendmessage(##outputhandle, 0x111, 1009, 0);//1009=クリア
return;

1.4 ダイアログに表示されるメッセージをコピーする。

エラー時など、ダイアログにメッセージが表示されます。ダイアログがアクティブ状態のまま、 "CTRL+C"を押すと、表示されている内容が、クリップボードにコピーされます。 この方法はWindows NT系OS(NT、2000、XP、Vista、7)でしか使用できません。

Windows9x系で、同じ事を行うには、外部ツールが必要になります。

など。

1.5 秀丸エディタの強制終了スクリプト

秀丸エディタ Ver.8.10β3から、常駐秀丸のメニューに、「マクロ中断!」が追加されました。

秀丸エディタを強制終了させるWSH(VBS)です。 無限ループに陥った場合、普通なら"ESC"キーで中断が出来ますが、効かない場合もあります。 (keypressedを使用するため、disablebreakした場合など) マクロを暴走させた時に使ってください。 普通に終了させることの出来る秀丸や、常駐秀丸を終了させてから、実行した方がいいでしょう。

WMIを使っているので、Windows2000、XP以降でしか動きません。 あまり使うことがないようにしましょう・・・。

1.6 秀丸エディタ強制終了ツール

Ver.7.08βより、秀丸エディタ ハングアップチェッカー (HmHang.exe)が添付されるようになりました。 秀丸エディタがハングアップした場合に、保護違反を発生させ、強制的に異常終了させるツールです。 可能な場合は最後に一度だけ保存を試みることが出来るようです。


top秀丸エディタマクロマクロ作成関連