うどんてっくメモ

技術的なメモをまったりと

Riderで開発するなら知っておきたい2つのデバッグ機能

はじめに

本記事はQualiArts Advent Calender 1日目の記事となります。 今年もUnity、Golang、会社施策などQualiArtsで使われている様々な技術、取り組みについて紹介しますので、ぜひぜひチェックしてみてください。

qiita.com

自分からはUnityで開発する上で重宝するJetBrains製IDE、Riderに備わっているデバッグ実行時に使える便利な機能を2つ紹介します。 本記事で検証しているツールのバージョンは以下の通りです。

  • Rider 2021.2

バージョンによっては挙動に差異がある場合がありますのでご注意ください。

Riderのデバッグ機能

開発において必要不可欠と言えるのがデバッグ実行によるプログラムの検証です。 バグを調べるのに怪しい部分にブレークポイントを貼って、挙動を検証して、というのは誰しもやる開発手順だと思います。 Riderではステップごとに値を出力してくれるおかげで、とりあえずブレークポイントを貼って実行してみるだけでも多くの情報を得ることができます。

f:id:myudon:20211119195537p:plain

これだけでもありがたいのですが、Riderにはデバッグ実行をさらに効率化する2つの大きな機能が存在します。

Evaluate expressions

プログラムの実行中に「このタイミングで任意のパラメータの確認や評価をしたい...」ということは多々あるのではないでしょうか。そんな時に便利なのがこのEvaluate expressionsです。 Evaluate expressionsはブレークポイントで停止した地点で任意の式を評価し、その結果をいい感じに出力してくれる機能です。 使うには、ブレークポイントのステップ停止の時に画像にある電卓マークのボタンを押します。

f:id:myudon:20211119195710p:plain

押すとEvaluate expressionsのウィンドウが開きます。ここに任意の式を入力します。

f:id:myudon:20211119195824p:plain

gameObject.nameの中身が表示されているのがわかると思います。より機能を説明するために、次のUnityのプログラムとブレークポイントで動かしてみます。

public class test : MonoBehaviour
{
    void Start()
    {
        var hoge = new Hoge();
        var fuga = new Fuga();
        
        Debug.Log(hoge.value);
    }
}

public class Hoge
{
    public int value = 1;

    public void Test()
    {
        value *= 100;
    }
}

public class Fuga
{
    public List<int> list = new List<int>(){ 0, 1, 2 };

    public override string ToString()
    {
        return "FugaToString";
    }
}

f:id:myudon:20211119210716p:plain

プログラムを動かし、ブレークポイントの地点まで進んだところで、Evaluate expressionsを使用し、hogeの中身を確認します。

f:id:myudon:20211119211304p:plain

画像にあるように、Evaluate expressionsではそのステップでの入力補完をサジェストしてくれるので便利です。ローカル変数などもしっかりサジェストされます。 実行するとhogeの中身が確認できます。

f:id:myudon:20211119211417p:plain

fugaについても同様に見てみます。

f:id:myudon:20211119213019p:plain

fugaについてはObject.ToStringが実装されているため、その文字列が出力されています。デバッグ時に見やすくなるよう実装してあると捗ります。 また、fugaのメンバにはListがありますが、その中身についても確認できることがわかるかと思います。
今度は値の変更を行ってみます。hoge.valueについて別の値にしてみます。 右クリックして「Set Value」を選択すると値の変更ができます。

f:id:myudon:20211119213842p:plain

f:id:myudon:20211119213818p:plain

画像のように値の変更も可能です。この後にプログラムの実行を再開するとDebug.Logの結果として変更した値が出力されるのを確認できるかと思います。 このように、よしなに情報を確認したり変更したりするとても便利な機能がEvaluate expressionsとなります。 ちなみに筆者は業務でこのEvaluate expressionsは愛用しています。

Immediate window

Riderのデバッグ実行に付随する機能の中でも最も強力かなと思うのが、このImmediate windowです。 Immediate windowはいわゆる対話式でデバッグ操作を直感的に要求できる機能です。デバッグ実行した際にImmediate Windowは常時起動しています。 次の画像はデフォルトのレイアウトですが、値の表示の下に表示されています。

f:id:myudon:20211119215057p:plain

ここに任意の処理を対話式で入力すると、対応の出力を行なったり、処理を行なってくれます。 使い方について、Evaluate Expressionsと同様のプログラムとブレークポイントで試してみます。

public class test : MonoBehaviour
{
    void Start()
    {
        var hoge = new Hoge();
        var fuga = new Fuga();
        
        Debug.Log(hoge.value);
    }
}

public class Hoge
{
    public int value = 1;

    public void Test()
    {
        value *= 100;
    }
}

public class Fuga
{
    public List<int> list = new List<int>(){ 0, 1, 2 };

    public override string ToString()
    {
        return "FugaToString";
    }
}

f:id:myudon:20211119210716p:plain

まずは適当なパラメータについて確認してみます。出力したい変数の名前を入力するだけです。 ちなみにここでもサジェストはしてくれます。hogeを試しに出力します。

f:id:myudon:20211119215241p:plain

hogeの中身が出力されました。 また、fugaについても見てみます。

f:id:myudon:20211119215401p:plain

fugaのメンバの簡略的な情報が出力されました。また、Evaluate expressions同様にObject.ToStringで実装した文字列が出力されています。 Evaluate Expressionsのようにclassの要素全ては出力してくれませんが、一定の中身は確認することができます。
次はEvaluate Expression同様に値の変更をやってみます。Immediate Windowでは代入処理を書き込むだけで実現可能です。

f:id:myudon:20211120000113p:plain

hogeインスタンスの値を書き換えていることがわかるかと思います。 値の変更については先ほどのEvaluate Expressionsなど他の手順でも可能ですが、このImmediate Windowを介したやり方が一番手軽です。 また、便利なのが任意の関数呼び出しも行えるところです。例としてfugaのlistを操作してみます。

f:id:myudon:20211120000352p:plain

ListのAddを呼び出し、要素を更新しているのがわかるかと思います。ステップでの各値の状態を制御できるのはもちろん、任意の処理について特定のタイミングで正常な挙動をしているかの検証にも活用できます。 そしてさらにすごいのが、一時変数の定義までできてしまうことです。試しに別のListを定義してみます。

f:id:myudon:20211120002603p:plain

適当な一時変数のListを作り、その要素をfuga.listに追加しています。 このように、一時変数を置いて何かしらのパラメータを格納したり、それを元に処理を行うといったことも可能です。 ここまで説明したように、Immediate Windowはお手軽ながらも多くの便利なデバッグ機能が詰まっている素晴らしい機能です。ぜひとも触ってみてください。

おわりに

RiderはJetBrains謹製の強力なIDEであり、本当に多くの機能が存在します。 デバッグのための機能だけでも様々なものがあり、本記事では紹介しきれなかったものもいくつか存在します。 他の機能についても知りたい方は公式のドキュメントを参考にしてみてください。

www.jetbrains.com