شاهد موقع الذاكرة / تثبيت "نقطة توقف البيانات" من التعليمات البرمجية؟

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

سؤال

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

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

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

المحلول

إذا كنت تستطيع التحكم في موقع المتغير، فيمكنك تخصيصها على صفحة مخصصة وتعيين أذونات الصفحة للسماح بقراءة فقط باستخدام virtualprotect. (على ويندوز ... لست متأكدا من لينكس).

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

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

نصائح أخرى

لا يزال بإمكانك توليد رموز التصحيح للحصول على جزء من التعليمات البرمجية "الإصدار". لا يزال من الممكن تشغيل هذا من خلال مصحح غريب تماما كما تفعل في وضع "تصحيح".

لقد فعلت مؤخرا شيئا ما شذالا بأحد برامج تشغيل الإصدار لدينا حتى نتمكن من تشغيله عبر VTune. للحصول على رابط MicroSfot، أضفت -DEBUG العلم، ل Microsoft CC أضفت -Zi. وبعد كل شيء يعمل بشكل جيد. MSKB LINK.

قد تجد هذا حلقة الوصل مفيد.

على افتراض أنك تستخدم Windows استخدم WINDBG لتصحيح البرنامج الخاص بك وتحقق من أمر BA - سيؤدي ذلك إلى كسر هذا عند الوصول إلى الذاكرة.

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

أخطاء APIS هي منصة خاصة، لكنها موجودة. شبابيك و UNIX. يمكن العثور على واجهات برمجة التطبيقات عبر الإنترنت.

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