3

一部の変数のウォッチウィンドウ値が「実世界」の値と一致していないように見えるという、非常に奇妙な問題が発生しています。デバッガーが宇宙空間でオフになっているように見えます。これを示す最も小さなコードスニペットは次のとおりです。

printf("%d", pNodes[nNode].nColumn); // watch shows "4"
printf("%d", nColumn); // watch shows "1"

if (pNodes[nNode].nColumn != nColumn)
  continue; // this is NOT called

したがって、動作は次のとおりです。

  1. に時計を追加するとpNodes[nNode].nColumn、値が表示されます4
  2. に時計を追加するとnColumn、値が表示されます1
  3. pNodes[nNode].nColumn != nColumnウォッチウィンドウで式を確認すると 、と評価されtrueます。
  4. continueステートメントはスキップされます!
  5. printf()何が起こっているかを確認するための呼び出しを追加しprintf()、値1とを出力します1。これは、コードの「フロー」の方法と一致しているようです(つまり、ステートメントの内部を呼び出しません。continueif

でメモリを確認することもできます。メモリに&pNodes(nNode].nColumnは、ウォッチウィンドウに表示されている「誤った」値が表示されます。したがって、デバッガは実際のプログラムデータなどから完全に「切断」されているようです。デバッグビルドの最適化を実行していますがオフになっています。また、pNodeがグローバル変数またはスコープの上位にある他の変数に対応していないことも確認しました。ローカルバージョンしかないようです。

これは私にとって完全に困惑しています!問題を理解するために次にどこに行けばいいのかさえわかりません。何かアイデアがあれば、ぜひ聞いてみてください!

ありがとう!

4

3 に答える 3

5

だから私は事件を解決したと思います:犯人はStructMemberAlignmentでした。私はたくさんのプロジェクトを混ぜ合わせました、そしてそれらのいくつかはプロジェクト内のこの分野のためにさまざまな価値を持っていました。それらすべての設定を削除して、VSにデフォルトを選択させるだけで、問題は解消されました。

適用可能な値は、一部のプロジェクトでは4バイト、一部のプロジェクトではデフォルト、その他のプロジェクトでは完全に空でした。値は、構成プロパティ/ C / C++/コード生成/構造体メンバーの配置の下にあります。繰り返しになりますが、プロジェクトの値を完全に削除することになりました。これは、ある種のクロスプラットフォームの問題に対処するために、過去のある時点でプロジェクトに設定されたと思いますが、少なくとも現在行っている作業では修正されています。

助けてくれてありがとう!

于 2011-09-01T22:35:22.570 に答える
2

スコープ内にない変数を使用してウォッチが設定されている場合、それはVisualStudioで常に見られる種類の動作です。それは本当に「<範囲外>」またはもっと便利な何かを言うべきです。

これらのコード行をステップ実行しても、これらの幽霊のような値が表示される場合は、わかりません。デバッグビルドであるかどうかはわかりませんか?

于 2011-09-01T22:08:31.520 に答える
0

Visual Studio 2010デバッガーには、ウォッチの可変メモリ位置の追跡に問題があります。VS2010は、表示されていると思われる変数を表示していないため、誤解を招くことがあります。

たとえば、関数内で変数名を再利用する場合、実行スコープの変更に応じて、ウォッチウィンドウに表示されるメモリの場所が変わります。

for (int i=0; i<10; i++) {
   i=i+1; // do something, what isn't important
}

int i;
for (i=0; i<5; i++) {
  i=i+1; // do something 
}

printf("i=%d\n", i);

次に、変数iをウォッチウィンドウに配置します。

明らかに、ウォッチウィンドウに表示されるi(または値)は重要です。プログラムを実行すると、プログラムがforループに入るときに、ウォッチがforループのi変数を追跡していることがわかります。forループを終了し、同じ名前の他の変数で以下のコードをヒットすると、ウォッチウィンドウはその変数のメモリを追跡していません。

2番目のループではiが0、1、2、...になり、2番目のループの後は実際には6であるにもかかわらず、ウォッチウィンドウはまだiが10であると宣言しているのがわかりますが、ウォッチウィンドウはまだiが10であると宣言しています。

そして、ウォッチウィンドウは何をすべきですか?言語規則では、常にこれらの変数の1つだけがスコープ内にあると示されているため、スコープ内にあるそのウォッチ名の変数の値を常に表示する必要があります。

ここでのデバッガーのウォッチウィンドウ機能のバグ(VS2010は、ウォッチで指定した名前に一致する関数の最初の変数を安価に見つけて、コード内に他に何があるかに関係なく、そのメモリスペースを熱心に監視しているようです、同じ名前の新しい変数がスコープを引き継いだ場合でも(その時点で、ウォッチウィンドウはあなたに横たわっています!)

于 2014-08-01T20:29:45.940 に答える