UEのC++のデバッグを便利にする”マイコード”関連のメモ

概要

UnrealEngineのデバッグをしている時に、Blueprintやリフレクションの為に実装されているコードがあると思います。
そういったコードは階層が非常に深くなる傾向にある上、一般的なユーザーは、そのコードをデバッグする事は殆どありません。
ローカルウインドウを見て、Blueprint関数のコールスタックを確認する位だと思います。
コールスタックを確認する場合には、イルミナディウインドウからPrintScriptCallstackを呼ぶことによって解決するので尚更少ないケースだと思います。

learn.microsoft.com

そういったケースを解決する為に、natjmcファイルやnatstepfilterファイルに外部コードの指定や、ステップフィルターの設定を書き加える事でデバッグを助けてくれます。
詳細は上記の公式ドキュメントを参照してください。

natjmcファイルを使った外部コードの設定に関して

コールスタックでUnrealEngineのBlueprint関連のコードを外部コードにして切り替えている様子

外部コードを設定時と未設定時の動作の比較

未対応 対応済み

引用Microsoft公式ドキュメント
C++デバッグ中:

  • 非ユーザー コードで [デバッグ]>[ステップ イン] を選択すると (または F11 キ> ーを押すと)、コードがユーザー コードの次の行にステップ オーバーされます。
  • 非ユーザー コードで [デバッグ]>[ステップ アウト] を選択すると (または Shift+F11 キーを押すと)、ユーザー コードの次の行まで実行されます。

コールスタックの外部コード部分をまとめて表示する機能の他にデバッガーのステップインの動作を便利にしてくれる機能もあります。
設定を有効にする為には、%USERPROFILE%\My Documents\\Visualizersフォルダにnatjmcファイルを配置する必要があります。

下記に実際にnatjmcを書いた際のサンプルコードを載せます。
本来はモジュールに対してや、ファイルに対しても設定出来ますが、必要にならなかったので検証していないのでサンプルには無い事をご容赦ください。

関数の適応サンプル

void HogeHoge();
template<class T, class Y>
void HugaHuga();
template<class T, class Y>
void Foo();
<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">

  <Function Name="HogeHoge" />
  <!--templateの関数を扱う際には&lt;*&gt;を入れる必要があります。-->
  <Function Name="HugaHuga&lt;*&gt;"/>
  <!--&lt;*&gt;とtemplate引数を一括に対応するのではなく、個別に記述する事も出来ます。-->
  <Function Name="Foo&lt;int, float&gt;"/>

</NonUserCode>

クラスの適応サンプル

class Hoge
{
    void Piyo();
    template<class T>
    void Foo();
};

template<class Y>
class Huga
{
    void Piyo();
    template<class T>
    void Foo();
};
<?xml version="1.0" encoding="utf-8"?>
<NonUserCode xmlns="http://schemas.microsoft.com/vstudio/debugger/jmc/2015">

  <Function Name="Hoge::Piyo" />
  <Function Name="Hoge::Foo&lt;*&gt;"/>

  <Function Name="Huga&lt;*&gt;::Piyo" />
  <Function Name="Huga&lt;*&gt;::Foo&lt;*&gt;"/>

</NonUserCode>

natstepfilterファイルを使ったステップフィルターの設定に関して

調査中

実際に私が使用しているサンプル

github.com