🐈

Visual Studioでのデバッグの方法をわかりやすく図解

2022/02/21に公開

はじめに

作ったプログラムが思ったように動かない、なんか変数の値がおかしいのでは?と、思ったとき、どのようにデバッグするでしょうか?

void min_max_normalize(const double* x, double* y, int n)
{
    double min_value = DBL_MAX;
    double max_value = -DBL_MAX;
    for (int i = 0; i < n; ++i) {
        if (min_value > x[i]) {
	    min_value = x[i];
	}
	if (max_value < x[i]) {
	    max_value = x[i];
	}
    }
    
    // デバッグ:ちゃんと値が求まっているか確認
    std::cout << "min_value = " << min_value << std::endl;
    std::cout << "max_value = " << max_value << std::endl;
    
    for (int i = 0; i < n; ++i) {
        y[i] = (x[i] - min_value) / (max_value - min_value);
    }
}

もちろん、この方法でも出来るし、これが正解の場合もあります。
ただ、この方法では、以下のような問題があります。

  • ソースコードが変更されるので、間違えてこのコードをコミットしてしまい、後々、不要なメッセージが表示されてしまう
  • forループや関数がたくさんある場合での変数の値を確認するのは難しい

というわけで、IDEを使っているのであれば、IDEのデバッグ機能を活用するべきです。

※この記事は、Visual Studio C++/C# を対象としていますが、Visual Studio Codeでも基本的な操作は同じです。

デバッグ実行での基本操作

デバッグ実行 (F5)

F5キーでデバッグ実行します。デバッグ実行すると、例外が発生した場合に該当箇所で停止してくれます。また、ブレークポイントでも停止します。
(デバッグなしで実行する場合は、Ctrl+F5です。)

ブレークポイントの設定/解除 (F9)

プログラムを一時停止したい行には、ブレークポイントを設定します。ブレークポイントを設定するには、一時停止したい行にカーソルを移動し、F9キーを押します。解除したい場合は、もう一度F9を押します。設定した行には、行の左側に赤い丸が付きます。赤い丸が表示される部分をクリックすることでも、ブレークポイントの設定/解除ができます。

ステップオーバー (F10)

ブレークポイントで一時停止中の場所から、一行一行実行したい場合には、F10を押します。

ステップイン (F11)

一時停止中の行にある関数の中に入りたい場合は、F11を押します。

ステップアウト (Shift+F11)

一時停止中の関数から外に出たい場合は、Shift+F11を押します。

カーソル行の前まで実行 (Ctrl+F10)

forループの外まで実行したい時などに、カーソルを実行したい行まで移動してCtrl+F10を押すことで、そこまで一気に実行します。ブレークポイントを設定することでも同じことが出来ますが、一回きりの場合は、この方法が楽です。

ブレークポイントについて

特定の条件のときに一時停止する方法

ブレークポイントでは、特定の条件の場合のみ止めることもできます。
ブレークポイントの赤丸を右クリックで表示されるメニューから「条件」を選ぶと「ブレークポイント設定」というのがインラインで表示されます。「条件」というチェックボックスにチェックを入れ、「条件式」「trueの場合」を選択し、右の入力欄に条件式を入力します。
この状態でデバッグ実行すると、このブレークポイントでは、その条件でのみ一時停止します。

デバッグ実行中にリアルタイムに値を確認する方法

また、一時停止させず、リアルタイムに値を確認したいのであれば、「アクション」というチェックボックスにチェックを入れ、入力欄に{x}のように表示したい変数名を入力すると、「出力」ウィンドウにxの値が表示されます。

変数の値を確認・変更する方法

ステップ実行をしているときに変数の値を確認したい場合は、マウスカーソルを変数に重ねるだけで表示できますが、より詳しく見たい場合は、変数の場所で右クリックし「クイックウォッチ」を選ぶか、Shift+F9を押します。
構造体やクラスの場合は、ツリー状に表示されます。

配列を指しているポインタの場合

配列を指しているポインタ(例えば、double* pointer;で要素数10)の場合は、入力欄に「pointer,10」と入力すると、ポインタの指している配列の中身が表示されます。

すでに実行中のプログラムに対してデバッグする方法

デバッグしたいプログラムが、別のプログラムから実行される場合や、DLLの場合は、「プロセスにアタッチ」機能(Ctrl+Alt+P)を使います。

この方法を使えば、Pybind11でモジュール化したプログラムをデバッグすることも可能です。
https://zenn.dev/t_ibe/articles/400aa60a12434d

おわりに

今回は、Visual Studioでのデバッグの方法を図解で紹介しました。ショートカットを覚えると、デバッグが捗るので、ぜひ活用しましょう。

メンバー募集中です
アダコテックは上記のような画像処理技術を使って、大手メーカーの検査ラインを自動化するソフトウェアを開発している会社です。
機械学習や画像処理の内部ロジックに興味がある方、ご連絡下さい!
我々と一緒にモノづくりに革新を起こしましょう!

https://adacotech.co.jp/recruit/

Discussion