سؤال

لقد أضفت بعض التعليمات البرمجية التي يتم تجميعها بشكل نظيف وتلقيت للتو خطأ Windows هذا:

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

أنا على وشك الذهاب في عملية بحث عن الأخطاء، وأتوقع أن يكون هذا شيئًا سخيفًا قمت به والذي حدث للتو لإنتاج هذه الرسالة.يتم تجميع الكود بشكل نظيف مع عدم وجود أخطاء أو تحذيرات.زاد حجم ملف EXE إلى 1,454,132 بايت ويتضمن روابط لـ ODCS.lib, ، ولكنه بخلاف ذلك عبارة عن لغة C خالصة لواجهة برمجة تطبيقات Win32، مع تشغيل DEBUG (يعمل على P4 على نظام التشغيل Windows 2000).

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

المحلول

للإجابة على السؤال، التعليمات المميزة هي كود تشغيل المعالج (تعليمات المجمع) والذي لا يمكن تنفيذه إلا في وضع "المشرف" (أو Ring-0).تميل هذه الأنواع من التعليمات إلى استخدامها للوصول إلى أجهزة الإدخال/الإخراج وهياكل البيانات المحمية من Windows kernel.

يتم تنفيذ البرامج العادية في "وضع المستخدم" (Ring-3) الذي لا يسمح بالوصول المباشر إلى أجهزة الإدخال/الإخراج، وما إلى ذلك...

كما ذكر آخرون، من المحتمل أن يكون السبب مكدسًا تالفًا أو استدعاء مؤشر دالة معطلًا.

نصائح أخرى

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

التعليمات المميزة هي تعليمات IA-32 يُسمح بتنفيذها فقط في Ring-0 (أي.وضع النواة).إذا قمت بذلك في مساحة المستخدمين، فإما أن لديك ملف EXE قديم جدًا، أو ملف ثنائي تالف.

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

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

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

#define MAX_NUM_TOOBAR_BUTTONS  (24)

حتى كانت موجودة!

يبدو موقع الخطأ 0x00486752 صغيرًا جدًا بالنسبة لي، قبل المكان الذي يوجد فيه الكود القابل للتنفيذ عادةً.وأنا أتفق مع دانيال، يبدو وكأنه مؤشر جامح بالنسبة لي.

لقد رأيت هذا مع Visual c++ 6.0 في عام 2000.

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

ابحث عن بعض حالات الخطأ التي قد تكون كامنة وتؤدي إلى تشغيل رمز التشخيص.

كنت أقوم بتصحيح الأخطاء والتراجع وقراءة التفكيك.لقد كان استثناءً أثناء المعالجة std::string, ، وربما فهرسة النهاية.

تحتوي وحدة المعالجة المركزية لمعظم المعالجات التي تم تصنيعها خلال الخمسة عشر عامًا الماضية على بعض التعليمات الخاصة القوية جدًا.يتم الاحتفاظ بهذه التعليمات المميزة لتطبيقات kernel لنظام التشغيل ولا يمكن استخدامها بواسطة البرامج المكتوبة بواسطة المستخدم.

وهذا يحد من الضرر الذي يمكن أن يلحقه برنامج مكتوب بواسطة المستخدم بالنظام ويقلل عدد المرات التي يتعطل فيها النظام فعليًا.

عند التنفيذ في وضع kernel، يتمتع نظام التشغيل بوصول غير مقيد إلى كل من kernel وذاكرة برنامج المستخدم.

تعليمات التحميل للسجلات الأساسية والحدية هي تعليمات مميزة.

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