Visual Studioでのデバッグの方法をわかりやすく図解
はじめに
作ったプログラムが思ったように動かない、なんか変数の値がおかしいのでは?と、思ったとき、どのようにデバッグするでしょうか?
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でモジュール化したプログラムをデバッグすることも可能です。
おわりに
今回は、Visual Studioでのデバッグの方法を図解で紹介しました。ショートカットを覚えると、デバッグが捗るので、ぜひ活用しましょう。
メンバー募集中です
アダコテックは上記のような画像処理技術を使って、大手メーカーの検査ラインを自動化するソフトウェアを開発している会社です。
機械学習や画像処理の内部ロジックに興味がある方、ご連絡下さい!
我々と一緒にモノづくりに革新を起こしましょう!
Discussion