1

コードのプリプロセッサ ブロックの最後で変数が変更されているように見えるコードのチャンクがあります。

int initialKeyCount;
#if(DEBUG)
//          int initialKeyCount = _root.CountAllKeys();
      initialKeyCount = 20000;
#endif
      currNode = currNode.EnsureDegreeKeysPresent(parent); //initialKeyCount = 19969 here
#if(DEBUG)
      int currentKeyCount = _root.CountAllKeys();
      Debug.Assert(initialKeyCount == currentKeyCount,
               string.Format("EnsureDegreeNodesPresent changed the node count from {0} to {1}.", initialKeyCount, currentKeyCount));
#endif

おそらく20000を割り当てた後、デバッガーinitialKeyCount = 19969でこれを実行すると、これを少しいじって、initialKeyCountへの割り当てが最初のプリプロセッサブロック内で正しいことがわかりましたが、コードが最初のプリプロセッサを離れるとすぐにブロックすると、値が魔法のように 19969 に変わります。

この動作は、変数が最初のプリプロセッサ ブロックの内部または外部で宣言されているかどうかに関係なく同じです。値は、2 番目のプリプロセッサ ブロック内では 19969 のままです。

プリプロセッサ ブロックで行われた割り当ては、そのブロックの外側では定義されていませんか? それは間違っているようですが、ここで起こっていることのようです。

4

5 に答える 5

1

この種の動作は、デバッガーが編集中のソースコードと一致しないコードを実行しているように聞こえます。ソースの変更により、実行しているコードに完全に到達していることを絶対に確信していますか?

プリプロセッサブロックは、言語構文とは無関係です。したがって、プリプロセッサブロックは変数定義のスコープに影響を与えないと言っているのは正しいです。

于 2009-01-06T00:18:36.220 に答える
0

私は Greg Hewgill に同意します - 私は以前にこの種のものを見たことがあります。

また、デバッガーが使用しているアセンブリを見つけて、Reflector で開きます。逆アセンブルにより、実際に何が起こっているかをよりよく理解できるはずです。

于 2009-01-06T00:25:08.767 に答える
0

Visual Studio が混乱したようです。これらの手順を順番に試してください

  1. クリーン コマンドを使用する
  2. Visual Studio を再起動します
  3. リモートからでもプログラムのように見えるすべての DLL と EXE を削除します。
  4. すべての BIN フォルダーと OBJ フォルダーを再確認して、見落としがないかどうかを確認します。
  5. ハードドライブ全体を検索して、リモートでもプログラムのように見えるDLLおよびEXEを探し、それらも削除します

私が働いていたIT企業では、これを週に1回見ていました。通常、同じプロジェクトの複数のコピーがある場合に発生しますが、それがなくても見たことがあります。

于 2009-01-06T02:48:31.083 に答える
0

このような問題に直面したときは、アセンブリ レベルで見てください。

アセンブリは、最近ではコーディングすることはほとんどないものですが、このような謎を追跡するには、それを知る必要があります。

于 2009-01-06T00:29:53.623 に答える
0

物事はますます見知らぬものになります。上記の提案を参考にして、Reflector とデバッガーによって提供される逆アセンブリを使用してコードを調べました。どちらも期待どおりに見えます。変数の「魔法の」変化を明確に示すために、コードを少し変更しました。

新しいコードは

int initialKeyCount;
#if(DEBUG)
//          int initialKeyCount = _root.CountAllKeys();
      initialKeyCount = 20000;
      initialKeyCount++;
      initialKeyCount = initialKeyCount;
#endif
      currNode = currNode.EnsureDegreeKeysPresent(parent);
#if(DEBUG)
      int currentKeyCount = _root.CountAllKeys();
      Debug.Assert(initialKeyCount == currentKeyCount,
               string.Format("EnsureDegreeNodesPresent changed the node count from {0} to {1}.", initialKeyCount, currentKeyCount));
#endif

上記の分解は、

int initialKeyCount;
#if(DEBUG)
//          int initialKeyCount = _root.CountAllKeys();
      initialKeyCount = 20000;
00000094  mov         dword ptr [ebp-50h],4E20h 
      initialKeyCount++;
0000009b  inc         dword ptr [ebp-50h] 
      initialKeyCount = initialKeyCount;
0000009e  nop              
#endif
      currNode = currNode.EnsureDegreeKeysPresent(parent);
0000009f  mov         edx,dword ptr [ebp-48h] 
...

メモリ ウィンドウを使用して、ebp-0x50 の値を確認しました。

00000094 の値は 0x0
0000009b の値は 0x4e20
0000009e の値は 0x4e21
0000009f の値は 0x4e01

アセンブリ コードを書いてから長い時間が経ったことは認めますが、nop がメモリに書き込むべきではないと確信しています。:)

明らかに、デバッガーが表示していないコードが実行されています。これを引き起こすプリプロセッサの使用方法に何かがあるのか​​ 、それとも単にバグなのか、誰かが知っていますか?

于 2009-01-06T01:40:29.847 に答える