VSN2003デバッガの使い方

学舎共通実習室の Windows にインストールされた Visual Studio .NET 2003 で, デバッガを使う方法です.

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

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

これって, Linux でいうと segmentation fault などに相当する場合が多いです. FAQを参照. プログラム segfault.cを例に見てみましょう.

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

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

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

とりあえず実行されるけど, 期待した動作と異なるとき

  1. ウィンドウ上部にあるプルダウンメニューが, Releaseでなく Debugとなっていることを確かめてビルドします
  2. ブレークポイント すなわち, プログラムを一時停止させたい点を設定しましょう. 真ん中のソース(プログラム) ソース(プログラム)が表示されている部分で, 問題が発生していると思われるよりも十分に前の行(わからなければ main の最初の行)で右クリックし, ブレークポイントの挿入を選びます(実は, 左の余白で左クリックでもいけます). すると, 左側に赤い丸がつきます. これを繰り返して, 怪しい場所すべてにブレークポイントを設定しましょう.
  3. 実行する. メニューの デバッグ > 開始を選ぶ. するとプログラムが開始され, 赤いマークに黄色の矢印が重なって停止します. 黄色の矢印は次に実行される行を表します. (注: デバッグなしで開始でなく ただの開始です. ただの開始の場合, プログラムが正常に終了するとすぐにウィンドウが閉じてしまいます. これが, エクスプローラから普通に実行したときの振る舞いなのです. 必要なら, main 関数の return 文にブレークポイントを設定しておきましょう.)
  4. 変数の値の表示 何がおかしいかは, その付近の変数の値を調べてみるとわかるかもしれません. 値を知りたい変数の上にマウスカーソルを持っていきましょう. 値が表示されます. ただし, これは, 黄色の矢印が指している行の1行前まで実行された時点での値です. マウスカーソルが指す行を実行していたときの値ではありません.
  5. 変数の値を常時表示するには デバッグ>ウィンドウ>ローカル, デバッグ>ウィンドウ>自動変数などを 利用します.
  6. 配列変数の値の表示 配列変数にマウスカーソルをあわせると, アドレス(ポインタとしての値)が表示されます. 配列の中身の値を知りたいときには, デバッグ>ウィンドウ>ローカル, デバッグ>ウィンドウ>自動変数などを 利用します.
  7. ブレークポイントの削除 十分調べて, ブレークポイントが不要になったら, その行で右クリックメニューからブレークポイントの解除を選びます (実は, 赤丸上で左クリックでもいけます). ブレークポイントの無効化とは一時的に効力を取り消すことです.
  8. ステップ実行 おかしくないようなら, 実行を続けることにしましょう. 実行を続けるには, デバッグメニューの中に, 次のような選択肢があります. 基本は 続行, ステップイン, ステップオーバー, ステップアウトです. 特に, ステップオーバーを繰り返し使うと, プログラムの実行の実際の流れを知ることができます.
    続行次のブレークポイントまで進む.
    ステップインプログラムファイル上で処理の流れにしたがって1行進む. 関数なら, 関数の中に進む.
    ステップオーバープログラムファイル上で流れにしたがって1行進む. 関数なら, 関数を1行と見なす.
    ステップアウト実行中の関数を終了して, 呼び出し側に制御を戻す.
    scanf などの入力の上に黄色矢印がある状態で, ステップオーバーすると, 黄色い矢印が消えます. この状態は, scanf が実行されて, 入力を待っている状態です. ターミナルウィンドウから何か入力すると, 再び次の行に黄色矢印が現れます.
  9. 進んだ使い方 変数がある条件を満たすようになったときのみ停止するブレークポイントとか, いろんな超絶技巧があります. 試してみてね.
  10. デバッグするプログラムに, コマンドライン引数を与えたい場合があります. それは, プロジェクト > プロパティ > デバッグ のコマンド引数で設定できます. 別のページ参照.

参考


Copyright © 2003-2005 Saburo Higuchi. All rights reserved.
樋口三郎 http://www.math.ryukoku.ac.jp/~hig/