3

デバッグのためにプログラムを中断する必要があるかどうかをチェックする if 節を書きました。

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

a負になるべきではありませんが、そうであることがわかりました。デバッグのために中断して、それが発生した場合に負になる理由を確認したいので、このif句を書きました。行a = a;にブレークポイントを設定しました。ブレークポイントは、if 句に入った場合にプログラムを停止することになっています。問題は、行が何もしないことです (これは何も台無しにしないために必要です)。そのため、行は最適化されなくなり、ブレークポイントは if 句の後に終了します。このトリックは通常は機能しますが、今回はコンパイラがあまり見つけられなかったようです。

言語は C++ で、qmake(Qt ツール) とmingw.

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

4

5 に答える 5

3

1 つの可能性は、I/O 関数を呼び出すことです。Java では、次のように記述できます。

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

同様に、C/C++ では、次のように記述できます。

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

関数呼び出しは事実上ノーオペレーションですが、コンパイラはそれを認識しておらず、呼び出しを最適化する可能性は低いです。

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

多くの最新の IDEでは、条件付きブレークポイントを設定できます: Visual StudioEclipse

于 2012-05-09T14:34:14.483 に答える
2

C または C++ の場合は、aasvolatileを定義するだけで解決します。

于 2012-05-09T23:18:35.387 に答える
1

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

if (a < 0) {
    printf("a < 0 !\n"); // <<< set breakpoint here
}
于 2012-05-09T14:34:05.870 に答える
1

移植性はありませんが、MSVC を使用して(コードがしばらくそのままになる可能性がある場合は …<code>#endif で__asm nop囲まれています)、コンパイラが触れないことがわかっている文字通りの no-op を挿入します。#ifndef NDEBUG

于 2012-05-09T23:21:12.123 に答える
0

何もしないで、それを使用しているファイルにヘッダー ファイルを含める必要がない NO_OP() マクロを定義しました。

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

コンパイラがこのマクロを最適化できるかどうかはわかりませんが、MinGW で動作します。

于 2012-05-09T23:02:13.540 に答える