2012-05-09 4 views
1

私はプログラムを壊す必要があるかどうかをチェックする場合は、句を書かれているデバッグやない:コンパイラによるブレークポイントの最適化の回避方法を教えてください。

if (a < 0) { 
    a = a; 
} 

a負になるべきではありませんが、私はそれがないことを発見した、と私はデバッグのために壊したくそれが起こるとなぜそれが否定的になるのかを知るために、私はこのif節を書いています。行a = a;には、if節に入るとプログラムを停止するはずのブレークポイントが設定されています。問題は、行が何もしないことです(これは何かを混乱させないために必要です)。そのため、行は最適化され、ブレークポイントはif節の後に終わります。このトリックは通常動作しますが、コンパイラは今回はそれほど見つからなかったようです。

言語はC++で、qmake(Qtツール)とmingwでコンパイルしています。

私の質問は、コンパイラがブレークポイントを設定しているときにコード行を最適化できないようにするにはどうすればいいですか?または、条件付きでデバッグ用のプログラムを中断する他の方法がありますか?

+1

どのような言語ですか?コンパイラは何ですか? – harold

+0

@harold:Qtツール 'qmake'を使ってC++と' mingw'(私の質問を更新しました)。私はちょうど今あなたの質問を見ましたが、私はすでに問題を解決しました(受け入れられた回答を参照)。 – HelloGoodbye

答えて

0

私は何もしませんし、任意のヘッダファイルをインクルードするためにそれを使用していたファイルを必要としないNO_OP()マクロを定義した:

#define NO_OP() {float f = 0; if (f != 0) exit(0);} 

コンパイラがなる場合、私は知りませんこのマクロを最適化することはできますが、それはMinGWで私にとってはうまくいきます。

+0

コンパイラが最近これを理解し、これを最適化すると仮定するのはかなり安全です。 – einpoklum

+0

ええ、おそらくそれはすべてのコンパイラではうまくいかないでしょう。 – HelloGoodbye

1

ここでは、通常、ブレークポイントを設定できるように、printf(またはcout、または使用している言語に適したもの)を入力します。

if (a < 0) { 
    printf("a < 0 !\n"); // <<< set breakpoint here 
} 
3

一つの可能​​性は、I/O機能を呼び出すことです。 Javaでは、1は書くことができます:

if (a < 0) { 
    System.out.printf(""); 
} 

同様に、C/C++で、1は書くことができます:関数呼び出しが効果的に何もしません

if (a < 0) { 
    printf(""); 
} 

にもかかわらず、コンパイラは知りませんコールを最適化することはまずありません。

また、条件付きでデバッグ用にプログラムを中断する方法はありますか? Visual StudioEclipse

現代の多くのIDEは1つが条件付きブレークポイントを設定することができます。

+0

ありがとう、あなたのノーオペレーションの提案はちょうど私にアイデアをくれた! – HelloGoodbye

1

CまたはC++の場合はavolatileと定義すると便利です。

0

それはポータブルではないが、MSVCで、私は、コンパイラが触れないだろう知っているノーオペレーションリテラルを挿入する(コードはしばらくの間、所定の位置にとどまる可能性がある場合#ifndef NDEBUG ... #endifに囲まれた)__asm nopを使用しています。