سؤال

لدي بعض التعليمات البرمجية في MS VC ++ 6.0 التي أخيصها. لسبب ما، في هذه النقطة هذه التي أحاول فيها حذف بعض الذاكرة المخصصة ديناميكيا، فهي فواصل وأحصل على مربع رسالة منبثقة قائلا "إن توقف المستخدم يسمى من التعليمات البرمجية في BLAH BLAH" .. ثم نافذة التفكك ينبثق وأنا يرى

*memory address* int      3

الشيء الغريب هو أنه ليس هناك مكان في الكود الذي أدعو تعليمات التجميع مثل هذا (أعتقد أن ASM INT 3 هو أمر كسر الأجهزة ل X86؟) ..

ما يمكن أن يسبب هذا؟

تحرير: الإجابة: كان الرمز الخاص بي "يمشي خارج نهاية" صفيف، ولكن فقط في المواقع التي تم وضعها بواسطة Visual Studio Debug مع 0xFDFDFDFD، والتي تسمى سياج Noman'Sland .. أعتقد أنه دعا أيضا خارج خطأ واحد .. كان هذا الصفيف لا علاقة له بالنقطة التي كنت أحرر فيها الذاكرة عند حدوث الخطأ. الذي جعل من الصعب الحصول على بقعة .. :(

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

المحلول

من المحتمل أنك تصل إلى رمز في إجراءات Debug Leap التي وجدت تلف كومة.

كيف تبدو مكدس المكالمات عندما تصل إلى INT 3؟

تحرير: بناء على تتبع المكدس في تعليقاتك، الروتين _CrtIsValidHeapPointer() يقول أن المؤشر يحرر أمر سيء. إليك مقتطف التعليمات البرمجية من مصدر DBGHEAP.C في MSVC

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData ستكون قيمة المؤشر الذي تحذفه.

نصائح أخرى

(أعتقد أن ASM INT 3 هو أمر استراحة الأجهزة ل X86؟

أنه. تسمى "نقطة توقف الأجهزة". وبعد إذا كنت تستخدم Debugger VS مع شفرة مصدر المشروع، فهو تماما مثل نقطة توقف (ولكن في التعليمات البرمجية). نظرا لأن VS2005، إذا تم إطلاق تطبيقك دون أي مصحح، فسيحطم التطبيق ببساطة، مثل إذا أطلق استثناء غير مدار.

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

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

يرى :

لذلك أقترح البحث عن بعض الماكرو أو الكائن القيام بذلك، أو ربما appen في وحدة نمطية (DLL / LIB) لا تملك رمز؟

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