- ベストアンサー
VC++のデバッグ方法
いつもお世話になっています。 今回はVC++6.0でのデバッグについてお聞きしたいです。 デバッグをする際、たとえば if (i > 1) { 処理 } という条件があったとして、環境が整っていないなどの理由で 条件を満たせないけど、処理の確認はしたい時、 デバッグであったらできるのでしょうか? 要するにデバッグのときだけ擬似的?(一時的?)にif文を無視することは できるのでしょうか? ご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
よくやるのは、 if (1 || i > 1) と、 1 || をつけると、必ず条件成立 if (0 && i > 1) と、 0 && をつけると、必ず条件不成立 というのがあります。 デバッグ時のみということであれば、たとえば、 #if defined(DEBUG) #define DEBUG_TRUE 1 || #define DEBUG_FALSE 0 || #else #define DEBUG_TRUE #define DEBUG_FALSE #endif という定義をしておいて、 if (DEBUG_TRUE i > 0) // デバッグ時に条件成立にしたいところ if (DEBUG_FALSE i > 0) // デバッグ時に条件不成立にしたいところ などとすれば、 #define DEBUG があれば、それ以降、それぞれ、無条件に、成立・不成立になります。 #deifne DEBUG がなければ、DEBUG_TRUE や DEBUG_FALSE はなかったことになります。 多くの処理系では、コンパイルオプション -d で #define が指定できるので、デバッグモードとリリースモードで、#define DEBUG の有無を指定できたりします。
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >#if _DEBUG >if文を無視 >#else >if(i>1) >#endif >処理を書く >という方法でやるという方法も大丈夫だと思いますがどうでしょうか。 これを書くなら #if _DEBUG i = 2; #endif if ( i > 1 ){ 処理 } も良いと思います。 これなら #else 部分を記述しなくても良いので。 ・環境が整っていないなら条件を満たす空処理(空関数)をデバッグ時に 読み込むようにすれば良いでしょう。 例えば abc() 関数があって条件を満たす値が 1 を返し、そうでなければ0なら #include "debug.c" をソースの先頭で記述して debug.c には #define abc() (1) という定義か、 extern int abc( void ){ return 1; } という空関数を定義します。 ※私は普段、このような空関数を用意して作成しています。 ※abc()関数の戻り値、引数さえしっかりと仕様として定義していれば良いので。 また debug.c には #ifdef _DEBUG ~ #endif の間に書くことでコンパイルの オプションより _DEBUG が定義されたら #include "debug.c" が有効になるように しておくのも便利です。完成後は #include "debug.c" の1行を削除すれば良い。 ・こちらの方法も参考にして下さい。
お礼
>>#if _DEBUG >>i = 2; >>#endif そのようなやり方もありますね。 確かにelseを書かなくてもいいのはいいと思います。参考にします。 空関数についても納得できました。 機会がありましたらチャレンジしてみます。 これからデバッグについていろいろ学んで生きたいと思います。 ご回答ありがとうございました。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.2 です。 補足にお書きいただいた方法でもOKです。 この場合は、 #define _DEBUG 1 // デバッグあり #define _DEBUG 0 // デバッグなし のようにデバッグの有無を切り替える形になりますが。 気持ちとしては、本来のソースコードにあまり形を加えたくないというのが、No.2 の方法にはあります。 また、この方法は、if() 自体は生きているので、デバッグの有無にかかわらず、if() の構文(括弧の釣り合いなど)がチェックできるのもメリットかもしれません。
お礼
>>気持ちとしては、本来のソースコードにあまり形を加えたくない それは当方もそう考えます。 これからそうできるよう勉強していきます。 ご回答ありがとうございました。
- Wr5
- ベストアンサー率53% (2173/4061)
>デバッグをする際、たとえば >if (i > 1) >{ 処理 } >という条件があったとして、環境が整っていないなどの理由で >条件を満たせないけど、処理の確認はしたい時、 >デバッグであったらできるのでしょうか? if文のところらブレークポイントを設定して、デバッグ実行します。 ブレークポイントで止まったら、変数の値を書き換えて実行を継続すればよいかと。 ウォッチなどのウィンドウでローカル変数の内容確認や書き換えが可能です。 # 文字列だと書き換えは面倒ですが(私が知らないだけかも知れませんけど)
お礼
ご回答ありがとうございます。 ウォッチの数字を変えられることは知っていましたが 何のためだろうと思っていました。 このように使う方法もあると知り勉強になりました。 ありがとうございました。
補足
ご回答ありがとうございます。 上記の説明とあっているかわかりませんが ひとつ方法が思いつきました。 #if _DEBUG if文を無視 #else if(i>1) #endif 処理を書く という方法でやるという方法も大丈夫だと思いますがどうでしょうか。 まだはじめたばかりなので上記説明の使用法を理解しきれないのですが デバッグはやはり重要であると思いますのでこれから勉強していきたいと思います。