Frage

Ich habe ein Stück Code, wo es scheint, dass eine Variable am Ende eines Vorprozessor Codeblock verändert.

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

Bei der Ausführung dieser im Debugger initialKeyCount = 19969 nach angeblich 20000. Zuweisung Ich habe mit diesem ein wenig herumgespielt und fand, dass Zuordnung zu initialKeyCount korrekt innerhalb des ersten Pre-Prozessorblock, aber sobald der Code verlässt der erste Pre-Prozessorblock auf magische Weise ändert sich der Wert auf 19.969.

Dieses Verhalten ist das gleiche, unabhängig davon, ob die Variable innerhalb oder außerhalb des ersten Pre-Prozessorblock deklariert wird. Der Wert bleibt 19969 innerhalb des zweiten Vorprozessor Block.

Sind in einem vorgeProzessorBlock aus Zuweisungen außerhalb des Blocks nicht definiert? Das scheint falsch, aber scheint zu sein, was hier geschieht.

War es hilfreich?

Lösung

Klingt wie Visual Studio verwechselt wurde. Versuchen Sie diese Schritte, um

  1. Verwenden Sie den Befehl Bereinigen
  2. Starten Sie Visual Studio
  3. Löschen jede DLL und EXE, die auch nur entfernt wie Ihr Programm sieht
  4. Überprüfen Sie alle BIN und OBJ-Ordner zu sehen, wenn Sie etwas verpasst.
  5. Suchen Sie Ihre gesamte Festplatte für jede DLL und EXE, die auch nur entfernt wie Ihr Programm sieht und löschen Sie sie zu

habe ich dies einmal pro Woche bei einem IT-Unternehmen zu sehen, für die ich gearbeitet. Es geschieht in der Regel, wenn Sie mehrere Kopien des gleichen Projektes haben, aber ich habe es auch ohne gesehen.

Andere Tipps

Diese Art von Verhalten klingt sehr ähnlich wie der Debugger Code ausgeführt wird, der nicht den Quellcode überein Sie bearbeiten. Sind Sie absolut sicher, dass Ihre Quelle ändert es machen den ganzen Weg, um den Code du läufst?

Die Prä-Prozessor-Blöcke sind in keinem Zusammenhang mit der Sprachsyntax. Sie sind also richtig zu sagen, dass Präprozessor Blöcke nicht den Umfang der variablen Definitionen beeinflussen.

ich mit Greg Hewgill zustimmen - ich so etwas gesehen haben.

Auch finden die Montage der Debugger und öffnen Sie sie mit Reflektor. Das Zerlegen sollten Sie eine bessere Vorstellung davon, was tatsächlich geschieht.

Wenn Sie mit so etwas wie diesem gegenüber, auf Baugruppenebene betrachtet es.

Sie während der Montage ist etwas, werden Sie fast nie Code in diesen Tagen ein BRAUCHT es zu wissen, Geheimnisse aufzuspüren wie diese.

Die Dinge Fremde und Fremde. Ich habe die oben genannten Vorschläge und untersuchte den Code mit Reflektor und der vom Debugger zur Verfügung gestellt Demontage, sehen beide als man erwarten würde. Ich leicht modifizierte den Code eindeutig die „Magie“ Änderung in den Variablen zu zeigen.

Der neue Code ist

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

Die Demontage für die oben ist

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] 
...

Mit dem Memory-Fenster sah ich den Wert bei EBP-0x50 Wenn IP

bei 00000094 ist der Wert 0x0
bei 0000009b ist der Wert 0x4e20
bei 0000009e ist der Wert 0x4e21
bei 0000009f der Wert 0x4e01

Ich gebe zu es ist eine lange Zeit her, dass ich jeden Assembler-Code geschrieben, aber ich bin ziemlich zuversichtlich, dass nop sollte nicht in dem Speicher schreiben. :)

Offensichtlich einige Code ausgeführt wird, dass der Debugger nicht angezeigt wird. Weiß jemand, ob es etwas gibt, ist, wie ich den Pre-Prozessor verwendet haben, die dies verursacht, oder ist dies einfach ein Bug?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top