「ModDebugger」の使い方

  • 概要

    ModDebuggerは、いわば、デバッグ情報の受信機です。
    よって、この使い方を理解するためには、
    実際にModDebuggerへとデバッグ情報を発信してみるのが一番理解が早いでしょう。

  • デバッグ情報を送信する側の簡単なサンプル

    1. まず、VC++にて、適当に新規プロジェクトを作ります。
      「Win32のコンソールアプリケーション」で、「空のプロジェクト」あたりが良いでしょう。
      (これでなくとも、通常のWindowsプログラムでも、x64でもなんでも問題ないです)




    2. ここでは日本語マルチバイト(=cp932≒Shift-JIS)しか取り扱わないので、
      プロジェクトのプロパティを開いて、文字セットを変更します。

      プロジェクトの構成プロパティの「全般」の項目に「文字セット」という項目がありますので、「Unicode文字セットを使用する」というのを変えて、「マルチバイト文字セットを使用する」にしましょう。



    3. さて、本題に入ります。

      ソースは、以下のようにする。
      まるで、printf("~")と書くのと同じ要領で、OutputDebugString("~") を利用します。

      (あってるかどうか、コピペが可能なソース。)
      #include <windows.h>
      
      void main(void) {
          OutputDebugString("テスト出力");
      }
      
      

    4. ここでは、話をわかりやすくするために、上のソースにて「MyMain.exe」というプログラムを作ったとします。

      Releaseコンパイルし、出来上がった .exe を直接実行してみましょう。

      (Visual C++から実行するのではなく、直接ちゃんとExplorerによる実行や、コンソール画面から実行する必要があります。)



      …何も表示されないでと思います。
      そう、何も表示されなくて正解です。

      しかし、Windowsのデバッグ情報共有領域のようなところに、ちゃんと出力されているのです!!
  • デバッグ情報をリアルタイムに読み取るのがModDebugger

    1. では、ModDebugger.exe を実行してください。
      (※天翔記が立ち上がっていれば、終了させること。)




      最初は、上図のような真っ黒な画面ですが、
      人によっては、何か「怪しげな文字」が順次、画面に流れていくかもしれません。

      これは何らかのアプリケーションが、Windowsのデバッグ情報領域に書き込んでいるためです。

    2. さて、では、この黒いウィンドウを開いた状態にしたままで、先ほど作った、「MyMain.exe」を実行してみましょう。



    3. 以上で、OutputDebugString("~"); を、とあるプログラムで記述することにより、
      そこが実行されると、ModDebugger.exe が受信する、ということが理解できたでしょう。

      これがあれば、PluginMod用の「一般MOD」や「ScenarioMod」の制作時のデバッグで役立つはずです。
  • OutputDebugStringをprintf風に

    OutputDebugString 関数を少し便利にしましょう。
    OutputDebugString関数は、そのままだと、「char *型」しか受け入れることができません。
    これでは、不便ですので、printfと同じように「フォーマット書式化文字列」を使えるような関数として、
    「デバッグ出力(const char *format, ...)」を考えてみましょう。

    #include <windows.h>
    #include <stdio.h>
    
    void デバッグ出力( const char *format, ... ) {
        char szBufDebug[4096] = "";
    
        va_list arg;
    
        va_start(arg, format);
        vsprintf_s(szBufDebug, format, arg);
        va_end(arg);
    
        OutputDebugString( szBufDebug );
    }
    
    
    void main(void) {
        デバッグ出力("%d:%s", 33, "テスト出力");
    }
    

    このように、printf と同様に利用できるようになりました。
    これなら便利に役立つことでしょう。

    なお、ScenarioMod SDKには、この関数「デバッグ出力」をさらに発展させたものが搭載されています。