3

Very frequently, I want to test the value of a variable in a function via a breakpoint. In many cases, that variable never actually gets referenced by any code that "does stuff", but that doesn't mean I don't still want to see it. Unfortunately, the optimizer is working against me and simply removing all such code when compiling, so I have to come up with convoluted grossness to fool the compiler into thinking those values actually matter so they don't get optimized away. I don't want to turn the optimizer off, as it's doing important stuff in other places, but just for this one block of code I'd like to temporarily disable it for the sake of debugging.

4

6 に答える 6

4

観察可能な動作を生成するコードは、定義による要件に適合します。たとえば、printf("")

揮発性変数へのアクセスも正式には観察可能な動作を構成しますが、一部のコンパイラが「不要な」揮発性変数を破棄しても驚かないでしょう。

このため、I/O関数の呼び出しが私にとって最良の候補であるように思われます。

于 2012-07-28T00:00:16.840 に答える
1

「volatile」キーワードを試すことができます。いくつかのイントロはhttp://en.wikipedia.org/wiki/Volatile_variableにあります。

一般的に、volatileキーワードは、変数の値が「独自に」変更できないと想定するコードにコンパイラーが最適化を適用しないようにすることを目的としています。

于 2012-07-27T23:59:53.827 に答える
0

やってみました

#pragma optimize("",off)

MSVS固有だと思います-http://msdn.microsoft.com/en-us/library/chh3fb0k(v=vs.80) .aspx

于 2012-07-27T23:56:01.447 に答える
0

コンパイラを指定しないので、デバッグに特に使用する変数に揮発性指定子を使用していることをここに追加します。私のコンパイラ(Embarcadero RAD Studio C ++ Builder)では、これを2年間使用していますが、変数が最適化されたことは一度もありません。このコンパイラを使用していないかもしれませんが、使用している場合は、volatileが常に機能していると言えます。

于 2012-07-28T00:07:33.163 に答える
0

これが私が使ったトリックの例です:

#include <ctime>
#include <iostream>
int main() {
    std::cout << "before\n";
    if (std::time(NULL) == 0) {
        std::cout << "This should not appear\n";
    }
    std::cout << "after\n";
}

time()呼び出しは常に正の値を返す必要がありますが、コンパイラーにはそれを知る方法がありません。

于 2012-07-28T00:26:47.387 に答える
0

デバッガーでブレークポイントにあるときに変数の唯一の目的を表示することである場合は、変数をグローバルにすることができます。たとえば、グローバルバッファを維持できます。

#ifdef DEBUG
char dbg_buffer[512];
template <typename T>
void poke_dbg (const T &t) {
    memcpy(dbg_buffer, &t, sizeof(T));
}
#else
#define poke_dbg(x)
#endif

次に、デバッグ中に、dbg_bufferの内容を検査できます(必要に応じて適切なキャストを使用)。

于 2012-07-28T02:08:05.823 に答える