لماذا تسرب تطبيق وحدة التحكم Windows الخاصة بي عند الخمول؟ (ولماذا يشير بندقية التدخين في Kernel32.dll ؟؟)

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

سؤال

لدي تطبيق وحدة التحكم متعددة المزيج من 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 () لا يمكن تنظيف هذه الذاكرة عند وفاة الخيط، بحيث من شأنها أن تظهر كمسرعة.

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