سؤال

أخوض برامج تعطل في نهاية المطاف بأحد الرسائل التالية:

1. DAMAGE: after normal block (#24729280) at 0x00D710E0
2. Debug Assertion Failed
   Program: D:\Soft\Test.exe
   File: dbgheap.c
   Line: 1017

   Expression: _BLOCK_TYPE_IS_VALID(phead->nBlockUse)

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

لقد وجدت معلومات حول pageheap. (الذي يبدو أنه قادر على أن تخبرني بما أريد) و gflags., ، ولكن يبدو أنني لا أستطيع أن نجعلها تعمل.

أنشأت برنامج اختبار:

char* test;
test = new char[5];
test[5] = 'a';
delete[] test;

الذي يثير خطأ:

DAMAGE: after normal block (#55) at 0x1671920

إذن، حاولت إرفاق PageHeap به عن طريق تشغيل:

gflags.exe /p /enable MemoryTest.exe /full

ثم إعادة تشغيله (كلاهما من خلال واجهة Visual C ++ 6.0 ومن خلال مستكشف Windows)، مما أدى إلى نفس الخطأ.

ثم حاولت ترجمة إصدار الإصدار، وارتفع ذلك من خلال واجهة Visual C ++ 6.0 للحصول على الخطأ:

User breakpoint called from code at 0x7c90120e

ومن مستكشف Windows، فقط حصلت على مربع حوار Windows الذي يطلب مني إرسال تقرير خطأ.

ماذا ينقصني؟

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

المحلول

يمكنك تشغيل التطبيق الخاص بك في وضع الإصدار عن طريق إرفاق Windbg..

  • تمكين gflags ( كما ذكرت)
  • بدء تشغيل التطبيق في وضع الإصدار.
  • إرفاقها إلى WINDBG باستخدام Attach to process الخيار في WINDBG.
  • تكوين المسار الصحيح لإصدار PDBS.
  • إعادة تحميل PDB يدويا باستخدام.reload /f في حالة فشل التحميل التلقائي.
  • أداء حالة الاستخدام.

سوف Windbg إيقاف التنفيذ كلما حدث استثناء. لكل فرصة أول فرصة، تحليل الأسباب. قد يكون أحد الأخطاء في التعطل.

نصائح أخرى

قبل استخدام Gflags / PageHeap، أقترح عليك التحقق من استثناء انتهاك الوصول. قم أولا بإرفاق العملية باستخدام خيار "ابدأ" بمجرد إرفاقها، تمكن استثناء انتهاك الوصول من خلال الذهاب إلى التحديد -> استثناءات حدد انتهاك الوصول وحدد خانة الاختيار توقف دائما. ثم تحقق مما إذا كانت مصححك يمسك باستثناءات انتهاك الوصول.

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