قيمة عدد صحيح التغييرات عند الخروج من المعالج كتلة
-
03-07-2019 - |
سؤال
لدي قطعة من التعليمات البرمجية حيث يبدو أن متغير يتغير في نهاية المطاف من قبل المعالج كتلة من التعليمات البرمجية.
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 حصلت على الخلط.جرب هذه الخطوات بالترتيب
- استخدام نظيف الأوامر
- إعادة تشغيل Visual Studio
- حذف كل DLL و EXE ولو من بعيد يبدو البرنامج
- الاختيار مزدوج كل بن OBJ مجلد لمعرفة ما إذا فاتك أي شيء.
- البحث عن كل القرص الصلب لأي 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
وأنا أعترف أنه مر وقت طويل منذ كتبت أي رمز التجميع، ولكن أنا واثق تماما من أن نوب يجب عدم الكتابة إلى الذاكرة. :)
ومن الواضح أن بعض التعليمات البرمجية المنفذة أن المصحح لا يعرض. لا أحد يعرف إذا كان هناك شيء حول كيفية لقد استعملت قبل المعالج الذي يسبب هذا، أم أن هذا مجرد علة؟