كيفية الحصول على تتبع المكدس عند C++ برنامج تعطل ؟ (باستخدام msvc8/2005)

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

سؤال

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

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

المحلول

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

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

ثم إرفاق مصحح أخطاء إلى العملية التي تحطمت.على سبيل المثال:windbg أو مقابل.

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

إذا كان لديك بالفعل مقابل المصحح المرفق وسوف تذهب تلقائيا إلى التعليمات البرمجية المصدر التي تسبب تحطم لك.

إن الحادث يحدث داخل المكتبة كنت تستخدم أنك لا تملك PDB على.لا يوجد شيء يمكنك القيام به.

نصائح أخرى

إذا كنت تقوم بتشغيل إصدار تصحيح على آلة مقابل ، ينبغي أن نقدم لكي يصل و تمكنك من رؤية تتبع المكدس.

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

كتبت هذه المدونة على بعض النصائح للحصول على المشكلة تظهر في مكدس الاستدعاءات حتى تتمكن من معرفة ما يجري.

http://www.atalasoft.com/cs/blogs/loufranco/archive/2007/02/06/6-_2200_Pointers_2200_-on-Debugging-Unmanaged-Code.aspx

أفضل نصيحة هي أن استخدام الأداة gflags لجعل مؤشر القضايا يسبب المشاكل الآنية.

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

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

هذه المادة توضح هذه المقالة كيفية حساب تتبع مكدس.

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

CrashFinder يمكن أن تساعدك على تحديد مكان استثناء نظرا DLL و عنوان الاستثناء ذكرت.
يمكنك أن تأخذ هذا الكود و دمجها في التطبيق الخاص بك أن يكون كومة trage تلقائيا عندما يكون هناك غير مسك استثناء.هذا يتم عادة باستخدام __try{} __except{} أو مع دعوة إلى SetUnhandledExceptionFilter والذي يسمح لك لتحديد رد على جميع الاستثناءات غير المعالجة.

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

الدكتورواتسون على ويندوز يمكن تثبيت قبل تشغيل: drwtsn32 -i تشغيل drwtsn32 (دون أي خيارات) سوف يظهر مربع الحوار تكوين.هذا سوف يسمح إنشاء تفريغ تعطل الملفات التي يمكنك في وقت لاحق تحليل مع WinDbg أو شيئا من هذا القبيل.

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

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