لماذا تسرب تطبيق وحدة التحكم Windows الخاصة بي عند الخمول؟ (ولماذا يشير بندقية التدخين في Kernel32.dll ؟؟)
-
18-09-2019 - |
سؤال
لدي تطبيق وحدة التحكم متعددة المزيج من Windows يبدو أنه يتسرب حوالي 4 كيلو بايت ذاكرة خاصة كل دقيقة أو نحو ذلك.
في محاولة لتوضيح التسرب، أوقفت تدريجيا كل مؤشر ترابط في التطبيق حتى توقف التسرب، ومفاجأتي يبدو أن الجاني هو موضوع يسمى "Win32Thread".
لا يبدو وكأنه موضوع بدأته صراحة.
إذا قمت بإرفاق وتفريق التطبيق، فإن تتبع المكدس يشبه هذا:
ntdll.dll!_KiFastSystemCallRet@0()
ntdll.dll!_NtCancelTimer@8() + 0xc bytes
ntdll.dll!_RtlpResetTimer@12() + 0x15 bytes
> ntdll.dll!_RtlpServiceTimer@12() + 0xfd bytes
ntdll.dll!_KiUserApcDispatcher@16() + 0x25 bytes
kernel32.dll!_BaseThreadStart@8() + 0x34 bytes
هل لدى أي شخص أي فكرة لماذا هذا سوف تسرب فجأة؟
التطبيق كما هو قيد التشغيل لمدة 40 ساعة على نظام ثنائي المزدوج Win2k3 SP2.
هناك أي أفكار موضع تقدير كبير.
المحلول
أن تتبع المكدس يبدو وكأنه في التعليمات البرمجية المتعلقة ب Timers. أعتقد أن الكود الخاص بك (أو مكتبة تستخدمها) بدأت مؤقتا باستخدام timeSetEvent
أو وظيفة مماثلة. في هذه الحالة، ربما يكون التسريب في وظيفة رد الاتصال الموقت.
يؤدي بدء تشغيل مؤقت متعدد الوسائط إلى إنشاء مؤشر ترابط، وسيتم استدعاء اتصالك من هذا الموضوع. سوف تفسر المؤقت الدوري لماذا تتسرب في حين odling.
نصائح أخرى
هل طلبك لديه أي APCs (مكالمات الإجراء غير المتزامن) أو أحداث المؤقت المجدولة؟ عمليات استكشافات توقيت الوسائط المتعددة.
إذا كان رد الاتصال الخاص بك يستخدم مكالمات وقت التشغيل C، فإن هذه المكالمات تجعل تخصيصات محلية لمرة واحدة (بتكاسل، مخصصة لأول مرة يتم استدعاء الوظيفة في مؤشر ترابط) للقيام بعملهم (_tcstol، sprinthf، إلخ). نظرا لأن الخيط لم يتم البدء مع begintread () أو begintreadex () لا يمكن تنظيف هذه الذاكرة عند وفاة الخيط، بحيث من شأنها أن تظهر كمسرعة.