Visual C++ 2013 デバッガーの使い方

Time-stamp: "2016-06-18 Sat 08:39 JST hig"

瀬田学舎の実習室にインストールされたVisual Studio 2013 に含まれる Visual C++ 2013 のデバッガーの基本的な使い方を説明します.

コンパイル成功, 実行できるけど, 期待した動作と異なるとき

プログラムを作成したら, コンパイルエラーはなくなったけど, 実行してみたら, 期待していた動作をしない, またはエラーダイアログが出て異常終了する, という状況に陥ったとしましょう. そんなときがデバッガの出番です.

デバッグビルド
  • ウィンドウ上部にあるプルダウンメニューソリューション構成が, Releaseでなく Debugとなっていることを確かめてビルドします
  • ブレークポイント
    プログラムを一時停止させたい点を設定しましょう. ソース(プログラム)が表示されている部分で, 問題が発生していると思われるよりも十分に前の行(わからなければ main の最初の行)で右クリックし, ブレークポイントの挿入を選びます(実は, 行番号よりも左のグレイの縦方向のバーで左クリックするだけでもいけます). すると, 左側に赤い丸がつきます.
    実行する
    メニューの デバッグ > デバッグ開始を選びます. するとプログラムが開始され, 赤いマークに黄色の矢印が重なって停止します. 黄色の矢印は次に実行される行を表します. (注: デバッグなしで開始でなく ただのデバッグ開始です. ただのデバッグ開始の場合, プログラムが正常に終了するとすぐにウィンドウが閉じてしまいます. これが, エクスプローラから普通に実行したときの振る舞いなのです. 必要なら, プログラムが結果を出力した後, 終了する直前, 典型的には main 関数の return 文にブレークポイントを設定しておきましょう.
    ブレークポイントの削除
    十分調べて, ブレークポイントが不要になったら, その行で右クリックメニューからブレークポイントの削除を選びます (実は, 赤丸上で左クリックでもできます). ブレークポイントの無効化とは, 位置は記録しておくけど一時的に効力を取り消すことです.
    ステップ実行
    おかしくないようなら, 実行を続けることにしましょう. 実行を続けるには, デバッグメニューの中に, 次のような選択肢があります. 基本は 続行, ステップイン, ステップオーバー, ステップアウトです. 特に, ステップオーバーを繰り返し使うと, プログラムの実行の実際の流れを知ることができます. ツールバーにアイコンがあります.
    続行次のブレークポイントまで進む.
    ステップインプログラムファイル上で処理の流れにしたがって1行進む. 関数なら, 関数の中に進む.
    ステップオーバープログラムファイル上で流れにしたがって1行進む. 関数なら, 関数を1行と見なす.
    ステップアウト実行中の関数を終了して, 呼び出し側に制御を戻す.
    scanf などの入力の上に黄色矢印がある状態で, ステップオーバーすると, 黄色い矢印が消えます. この状態は, scanf が実行されて, 入力を待っている状態です. ターミナルウィンドウから何か入力すると, 再び次の行に黄色矢印が現れます.
    • 変数がある条件を満たすようになったときのみ停止するブレークポイントとか, いろんな超絶技巧があります. 試してみてね.

    変数の値を調べるには

    停止した状態で変数の値を調べましょう.

    変数の値の表示
    何がおかしいかは, その付近の変数の値を調べてみるとわかるかもしれません. 値を知りたい変数の上にマウスカーソルを持っていきましょう. 値が表示されます. ただし, これは, 黄色の矢印が指している行の1行前まで実行された時点での値です. マウスカーソルが指す行を実行していたときの値ではありません.
    変数の値を常時表示
    デバッグ>ウィンドウ>ローカル, デバッグ>ウィンドウ>自動変数などを 利用します. 自動変数のエリアで右クリックして, 表示する変数を追加できます.
    配列変数の値の表示
    配列変数にマウスカーソルをあわせると, アドレス(ポインタとしての値)が表示されます. 配列の中身の値を知りたいときには, デバッグ>ウィンドウ>ローカル, デバッグ>ウィンドウ>自動変数などを 利用し, 左端の三角形のアイコンをクリックして展開し, 配列の中身の値を表示させます.

    実行すると警告ウィンドウがでるとき

    これって, Linux でいうと segmentation fault などに相当する場合が多いです. FAQを参照.

    1. ウィンドウ上部にあるプルダウンメニューが, Releaseでなく Debugとなっていることを確かめてビルドします.
    2. デバッグ > デバッグ開始(デバッグなしで開始でなく)して, 警告ウィンドウが出て停止するのを待ちます.
    3. ソースの左側の黄色の矢印がでている行が原因で, 警告されていることがわかります(ウィンドウ内にも説明が書かれています).
    4. 上に書いてある方法を利用したりして, 変数の値が異常でないか調べてみたりしましょう.
    5. デバッグ > デバッグ開始で実行したときには, プログラムが終了すると同時にウィンドウが閉じてしまうことに注意. 必要なら, いちばん最後に, (上で説明する)ブレークポイント設定しておいてね.

    実行するとプログラムが黙ってしまうとき

    無限ループに陥っているのかもしれません.

    1. ウィンドウ上部にあるプルダウンメニューが, Releaseでなく Debugとなっていることを確かめてビルドします
    2. デバッグ > デバッグ開始(デバッグなしで開始でなく)
    3. 無限ループにはいったと思われる状態になったら, デバッグ>すべて中断を選びます.
    4. このときソースの左側の黄色の矢印がでているのが, その時点で実行していた行です. この行が無限ループの内側にある可能性が高いでしょう.
    5. 上に書いてある方法を利用したりして, 変数の値が異常でないか調べてみたりしましょう.

    追加資料

    このサイトのコンテンツ

    QRcode to hig3.net

    http://hig3.net