قيمة عدد صحيح التغييرات عند الخروج من المعالج كتلة

StackOverflow https://stackoverflow.com/questions/414986

سؤال

لدي قطعة من التعليمات البرمجية حيث يبدو أن متغير يتغير في نهاية المطاف من قبل المعالج كتلة من التعليمات البرمجية.

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

عند تنفيذ هذا في المصحح initialKeyCount = 19969 بعد من المفترض تعيين 20000.لقد لعبت حوالي مع هذا قليلا وجدت أن الإحالة إلى initialKeyCount هو الصحيح داخل أول قبل المعالج كتلة ، ولكن بمجرد أن قانون الأوراق الأولى قبل المعالج كتلة قيمة سحرية التغييرات 19969.

هذا السلوك هو نفسه بغض النظر عما إذا تم تعريف المتغير داخل أو خارج أولا قبل المعالج كتلة.تظل القيمة 19969 داخل الثانية قبل المعالج كتلة.

هي المهام في مرحلة ما قبل المعالج كتلة غير محددة خارج تلك الكتلة ؟ يبدو أن الخطأ ولكن يبدو أن ما يحدث هنا.

هل كانت مفيدة؟

المحلول

يبدو Visual Studio حصلت على الخلط.جرب هذه الخطوات بالترتيب

  1. استخدام نظيف الأوامر
  2. إعادة تشغيل Visual Studio
  3. حذف كل DLL و EXE ولو من بعيد يبدو البرنامج
  4. الاختيار مزدوج كل بن OBJ مجلد لمعرفة ما إذا فاتك أي شيء.
  5. البحث عن كل القرص الصلب لأي DLL و EXE ولو من بعيد يبدو البرنامج الخاص بك وحذفها جدا

كنت أرى هذا مرة واحدة في الأسبوع في الشركة عملت.فإنه عادة ما يحدث عندما يكون لديك نسخ متعددة من نفس المشروع ولكن رأيت ذلك حتى دون ذلك.

نصائح أخرى

وهذا النوع من السلوك تبدو كثيرا مثل المصحح يتم تشغيل التعليمات البرمجية التي لا تتطابق مع شفرة المصدر تقوم بتحريرها. هل أنت متأكد تماما من أن التغييرات المصدر تجعل من كل وسيلة لالشفرة التي تقوم بتشغيل؟

وكتل المعالج لا علاقة لها بناء الجملة اللغوية. لذا، أنت الصحيح في القول بأن الكتل المعالج لا تؤثر على نطاق التعريفات المتغيرة.

وأنا أتفق مع غريغ Hewgill - لقد رأيت هذا الشيء من قبل.

وبالإضافة إلى ذلك، العثور على التجميع المصحح يستخدم وفتحه مع العاكس. وdissassembly يجب أن تعطيك فكرة أفضل عن ما يحدث في الواقع.

وعندما تواجه مع شيء من هذا القبيل، ننظر إليها على مستوى التجمع.

وعلى الرغم من والتجمع شيء سوف أبدا تقريبا التعليمات البرمجية في هذه الأيام واحدة <م> يحتاج للتعرف عليها لتعقب أسفل أسرار من هذا القبيل.

والامور أغرب وأغرب. أخذت الاقتراحات المذكورة أعلاه ودراستها رمز مع العاكس والتفكيك التي تقدمها المصحح، على حد سواء تبدو كما كنت تتوقع. I تعديل رمز قليلا لتظهر بوضوح التغيير "السحر" في المتغير.

والقانون الجديد هو

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 عندما IP هو

وعلى 00000094 القيمة 0x0
في 0000009b القيمة 0x4e20
في 0000009e القيمة 0x4e21
في 0000009f القيمة 0x4e01

وأنا أعترف أنه مر وقت طويل منذ كتبت أي رمز التجميع، ولكن أنا واثق تماما من أن نوب يجب عدم الكتابة إلى الذاكرة. :)

ومن الواضح أن بعض التعليمات البرمجية المنفذة أن المصحح لا يعرض. لا أحد يعرف إذا كان هناك شيء حول كيفية لقد استعملت قبل المعالج الذي يسبب هذا، أم أن هذا مجرد علة؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top