最終更新日 2024-09-25

「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には、この関数「デバッグ出力」をさらに発展させたものが搭載されています。