- ベストアンサー
windowsプログラムのデバッグ
最近VCでwin32API Applicationを作り始めたのですが イベントに対する挙動をチェックしたいのですが方法がわかりません。 今まではConsoleプログラムだけなのでプログラムが動かなかった場合、どこまで動いているのかprintfで チェックしていたのですがwindowsプログラムの場合どうすればそのような動作チェックができるのでしょうか。 プログラム自体はwaveIn、waveOut系を使った録音・再生するだけのプログラムです。 具体的なバグは録音終了を表すMM_WIM_DATAメッセージが 送られてきた場合に再生ボタンを使用可したいのですが 設定した録音時間の3秒をすぎても使用可能になりません。 デバッグ方法がわかればMM_WIM_DATAが本当に行われているのか、 行われていた場合どこでとまっているのか、がわかると思うので教えて頂きたいです。 【開発環境】 環境:VC++6.0ProffessionalEditon OS:Windows2000 【その他】 C言語の知識は入門書を一通り理解できる程度。 リソースファイルは使用しておりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 私も処理のポイント、ポイントでログを採取しながらデバッグを行っていました。 先ずは、printf のように可変の引数を取れる関数を作成して、その中で 特定のファイルにログを採取するようにしておきます。 → 仮に、TraceLog と言う関数とします。 次に、共通のinclude ファイルに以下のマクロを定義しておきます。 ---------------------- #ifdef _DEBUG #define DeB(p) p #else #define DeB(p) #endif ---------------------- 後はプログラムのポイント、ポイントで以下のようなログを埋め込んで行きます。 func1(long *p1, char *p2) { DeB(TraceLog("func1 debug start!! p1=%x p2=%s\n", p1, p2)); : 実際のプログラム : DeB(TraceLog("func1 debug end. rinf=%d\n", rinf); return(rinf); } この状態で、Debug で (_DEBUG マクロを有効にして) コンパイルを行えば トレースが有効になるのでデバッグのための情報を採取できます。 実際の運用時には、Release で (_DEBUG マクロを無効にして) コンパイルを 行うので、トレースは採取されませんし、デバッグ文自体がNOP になるので 性能にも影響を与えません。 以上のようにしておくと、プログラムの途中で、#ifdef ~ #endif を記述 する必要がなくなるので、プログラムの可読性も向上します。
その他の回答 (2)
- KenDon
- ベストアンサー率0% (0/2)
まず、メニューの[ビルド]の[アクティブな構成の設定]を[Debug]にします。 次に、左下のところに、[Class][Resource][File]のタブがあるので、[File]をクリックし、[SourceFile]のフォルダをクリックし、その中から、自分の作ったソース、ファイルを選択します。 次に、プログラムの止めたい、ところにカーソルを置き、[F9]キーを押します。 そうすると、その行の左端に、●が付きます。もう一度[F9]キーを押すと解除されます。 次に、[F5]キーを押すと、ビルドしますか?とでるので、[はい]を押します。 そうすると、ビルド(コンパイル)されプログラムが実行され、●のところで、右矢印が出て、止まるはずです。止まらなければ、そこは、実行されていないことになります。 止まったら、自分の見たい変数の上にマウスカーソルをもっていけば、値を見ることができます。
お礼
実際に使ってみました。 変数の確認に使うと便利でした。 助かりました、どうもありがとうございました。
- taknt
- ベストアンサー率19% (1556/7783)
デバッグ用のあるファイルを作成し、そのファイルが存在すれば、 そのファイルに変数などの内容を出力してあげればいいでしょう。 で、実際、リリースするときは、そのファイルをつけなければいいだけですからね。 また、不具合が発生した場合は、そのファイルを作成してもらい、 そのファイルの内容でデバッグできれば、一石二鳥です。 イベントの発生を受け付ける箇所にログ出力をつければいいでしょう。
お礼
早急な回答ありがとうございます。 この方法である程度バグを取り除くことができました。 ありがとうございました。
お礼
#ifdef等の知識がなかったので最初はわかりませんでしたが調べてわかりました。 例を挙げての丁寧な回答ありがとうございました。 大変参考になりました。
補足
お礼を書いた後ですが・・・ バグ元はだいたい見当がついたのでそれについての 質問を新規に投稿するのでよろしければご回答ください。 (補足に書くべきか迷いましたがよろしくお願いいたします。)