هايزنبوغ:يتعطل برنامج WinApi على بعض أجهزة الكمبيوتر

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

سؤال

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

بيئة:نظام التشغيل Windows XP، Visual C++ 2005/2008، برنامج WinApi الخام.

وإليك ما هو مؤكد حول "Heisenbug":

1) يحدث العطل فقط في إصدار الإصدار.

2) يختفي العطل بمجرد إزالة كافة العناصر المتعلقة بـ GDI.

3) لا يوجد لدى BoundChecker أي شكوى.

4) توضح كتابة السجل أن العطل يحدث عند إعلان متغير int محلي!كيف يمكن لذلك ان يحدث؟فساد الذاكرة؟

اي افكار يمكن ان تكون رائعه للعرض!

تحديث:لقد تمكنت من تصحيح أخطاء التطبيق على جهاز كمبيوتر "معيب".النتائج:

"الاستثناء غير المعالج عند 0x0044a26a في CintaNotes.exe:0xC000001D:تعليمات غير قانونية."

وفواصل التعليمات البرمجية

0044A26A cvtsi2sd xmm1,dword ptr [esp+14h]

لذلك يبدو أن المشكلة كانت في خيار برنامج التحويل البرمجي "إنشاء التعليمات البرمجية/تمكين مجموعة التعليمات المحسنة".تم ضبطه على "/arch:SSE2" وكان يتعطل على الأجهزة التي لا تدعم SSE2.لقد قمت بتعيين هذا الخيار على "غير محدد" واختفى الخطأ.أوف!

شكرا جزيلا لكم جميعا على المساعدة!!

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

المحلول

إذن لا يتعطل عندما يكون التكوين هو تكوين DEBUG؟هناك أشياء كثيرة مختلفة عن تكوين الإصدار:1.) تهيئة الكرات 2.) رمز الجهاز الفعلي الذي تم إنشاؤه وما إلى ذلك ..

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

-إعلان

نصائح أخرى

4) كتابة سجل يوضح أن العطل يحدث عند إعلان متغير int محلي!كيف يمكن لذلك ان يحدث؟فساد الذاكرة؟

ما هو الكود الأساسي في الملف القابل للتنفيذ/التجميع؟إعلان int ليس رمزًا على الإطلاق، وبالتالي لا يمكن أن يتعطل.هل تقوم بتهيئة int بطريقة أو بأخرى؟

لرؤية الكود الذي حدث فيه العطل، يجب عليك إجراء ما يسمى تحليل ما بعد الوفاة.

الإبلاغ عن الأخطاء في نظام التشغيل Windows

إذا كنت تريد تحليل العطل، فيجب أن تحصل على ملف تفريغ التعطل.أحد الخيارات لذلك هو التسجيل في خدمة "تقرير الأخطاء في Windows" - وهو يتطلب بعض المال (تحتاج إلى معرف توقيع الرمز الرقمي) وبعض تعبئة النماذج.لمزيد من الزيارة https://winqual.microsoft.com/ .

احصل على ملف تفريغ الأعطال المخصص لـ WER مباشرة من العميل

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

تفريغ صغير خاص بك

هناك خيار آخر وهو تسجيل معالج الاستثناء الخاص بك والتعامل مع الاستثناء وكتابة تفريغ مصغر في أي مكان تريده.الوصف التفصيلي يمكن العثور عليه في تصحيح أخطاء مشروع التعليمات البرمجية بعد الوفاة لتطبيقك باستخدام مقالة Minidumps وVisual Studio .NET.

1) يحدث العطل فقط في إصدار الإصدار.

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

2) يختفي العطل بمجرد إزالة كافة العناصر المتعلقة بـ GDI.

ربما يكون هذا تلميحًا إلى أنك تفعل شيئًا خاطئًا فيما يتعلق بالأشياء المتعلقة بـ GDI؟هل تستخدم المقابض بعد تحريرها، على سبيل المثال؟

تحميل أدوات التصحيح لنظام التشغيل Windows طَرد.قم بتعيين مسارات الرموز بشكل صحيح، ثم قم بتشغيل التطبيق الخاص بك ضمن WinDbg.في مرحلة ما، سيتم قطع الاتصال بانتهاك الوصول.ثم يجب عليك تشغيل الأمر "!analyze -v"، وهو أمر ذكي جدًا ويجب أن يعطيك تلميحًا حول الخطأ الذي يحدث.

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

حاول تجاوز المخصصات الخاصة بك حتى لا تنفد الذاكرة عند التخصيص.هل تختفي المشكلة (أو تصبح أكثر قابلية للتكرار؟)

يُظهر كتابة السجل أن العطل يحدث عند إعلان متغير int محلي!كيف يمكن لذلك ان يحدث؟فساد الذاكرة؟

تجاوز المكدس!;)

4) كتابة سجل يوضح أن العطل يحدث عند إعلان متغير int محلي! كيف يمكن أن يكون ذلك؟فساد الذاكرة

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

ماذا يقول الحادث؟انتهاك وصول ؟استثناء ؟سيكون هذا هو الدليل الإضافي لحل هذه المشكلة

تأكد من عدم وجود أي تلف سابق في الذاكرة باستخدام PageHeap.exe

تأكد من عدم وجود تجاوز لسعة المكدس (صفيف CBig [1000000])

تأكد من عدم وجود ذاكرة غير مهيأة.

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

"4) توضح كتابة السجل أن العطل يحدث عند إعلان متغير int محلي!كيف يمكن لذلك ان يحدث؟فساد الذاكرة؟"

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

عندما أحصل على هذا النوع من الأشياء، أحاول تشغيل التعليمات البرمجية من خلال برنامج gimpels PC-Lint (تحليل التعليمات البرمجية الثابتة) لأنه يتحقق من فئات مختلفة من الأخطاء إلى BoundsChecker.إذا كنت تستخدم Boundschecker، فقم بتشغيل خيارات إفساد الذاكرة.

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

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

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

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

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

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

حظ سعيد!

يحرر:

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

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

في أي وقت رأيته لفترة طويلة من الزمن، كان علي أن أذهب إلى IDA Pro. التصحيح التفصيلي لتفكيك وقت التشغيل هو الشيء الوحيد الذي أعرفه والذي يحصل على تلك الأشياء بشكل موثوق.

يستخدم العديد من المطورين WinDbg لهذا النوع من التحليل.ولهذا السبب اقترحت أيضًا Minidump.

جرب PurifyPlus من Rational (IBM).إنه يلتقط الكثير من الأخطاء التي لا يرصدها BoundsChecker.

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