سؤال

لدي عملية تعالج الاستثناءات رائعة. يدعو:

_set_se_translator(exception_trans_func); 
SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler);
_set_purecall_handler(purecallHandler);
set_terminate(terminateHandler);
set_unexpected(unexpectedHandler);
_set_invalid_parameter_handler(InvalidParameterHandler);
atexit(exitHandler); //ignored during an expected exit
_onexit(onexitHandler); //ignored during an expected exit

في أي وقت يحدث فيه استثناء ، يُطلق على أحد المعالجات والذي يخلق تفريغًا تحطمًا بالنسبة لي. الحياة جيدة.

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

أشارت التعليمات في "0x101ba9df" الذاكرة في "0x00000004". الذاكرة لا يمكن قراءة". انقر فوق موافق لإنهاء .... "

يبدو مرجع الذاكرة لـ X000000004 وكأنه مؤشر فارغ. والنظر في هذا العنوان يبدو لكي تكون مدمرة كائن STL عالمي (ربما في مكالمة init في CRT حيث يتم تنظيف الكرات).

أنا الآن عالق على الرغم من أنني لا أستطيع الحصول على تفريغ التشخيص ومكدس الاتصال وأرى بالضبط ما يجري. لذا....

لماذا لا يتم توجيه الاستثناء من خلال المعالجات أعلاه ، وبدلاً من ذلك يتم عرضه على المستخدم؟

هل هناك أي طريقة لإخفاء هذا الحوار (نظرًا لأنه لا يوجد أي ضرر في تلك المرحلة)؟

وهل هناك طريقة لتعقب خطأ الجذر؟

شكرا على أي أفكار.

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

المحلول

ما هو نظام التشغيل الذي يديرونه؟

أفترض أنك تقوم بتعيين وضع الخطأ باستخدام شيء مثل

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

للتأكد من أن Windows لا يقفز مع معالجة الأخطاء الخاصة به؟

نصائح أخرى

هذا يبدو أن CRT قد وضعت كتلة Try/Catch Seh (لا يمكن كتابتها بشكل صحيح ، وركل Markdown) حول جزء من الرمز ، وتوصل إلى استثناء لعرض الرسالة ، لذلك لا ينتهي بك الأمر إلى الاتصال غير مهذب مسار رمز الاستثناء. قد تضطر إلى القيام ببعض القرصنة CRT لمعرفة ما يحدث.

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

لقد رأيت هذا مع STL VS2008. هناك بعض كائنات قفل STL التي يتم إنشاؤها عبر مستوى ملف ثابت أثناء البدء.

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

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