تصحيح مشاكل تخصيص ذاكرة Visual C ++
-
13-09-2019 - |
سؤال
أخوض برامج تعطل في نهاية المطاف بأحد الرسائل التالية:
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، أقترح عليك التحقق من استثناء انتهاك الوصول. قم أولا بإرفاق العملية باستخدام خيار "ابدأ" بمجرد إرفاقها، تمكن استثناء انتهاك الوصول من خلال الذهاب إلى التحديد -> استثناءات حدد انتهاك الوصول وحدد خانة الاختيار توقف دائما. ثم تحقق مما إذا كانت مصححك يمسك باستثناءات انتهاك الوصول.