كيف يمكنني معرفة ما إذا كان الرمز المدارة الخاص بي يتسرب من الذاكرة بسبب مكالمات المكتبة الأصلية؟

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

سؤال

لدي DLL مُدار يدعو إلى مكتبة أصلية. هذه المكتبة الأصلية تُرجع عمومًا IntPtrs. يمكن نقلها إلى طرق أخرى في المكتبة الأصلية للقيام بالأشياء ، أو إخبار المكتبة بتحرير المثيل المرتبط بـ INTPTR. ولكن فقط بعض الحالات التي تحتاج إلى إطلاق سراحها بهذه الطريقة ، تتم إدارة البعض الآخر من قبل المكتبة. المشكلة هي أن الوثائق ليست واضحة دائمًا حول الحالات التي يجب تحريرها وأيها يجب ألا.

ما أريد معرفته هو ما إذا كانت هناك طريقة يمكنني من خلالها معرفة ما إذا كان الكود قد احتفظ بالإشارات إلى أي من المؤشرات التي يجب تحريرها ، وبالتالي تسبب في تسرب الذاكرة؟

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

المحلول

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

نصائح أخرى

أستخدم Windbg (متاح هنا). تشمل خط الأوامر الذي يحركه ولكن يوفر الكثير من التقارير الجيدة معلومات المكدس وأرقام الكائنات والحجم المأخوذ (يمكن أن يساعد ذلك في الإشارة إلى العناصر التي لا يتم التخلص منها).

هناك أيضًا أداة تشخيص التصحيح التي لديها تقارير محددة للذاكرة والتعامل مع التسريبات. انها هنا

قد ترغب في التفكير في استخدام SafeHandles لالتفاف المقابض التي تم إرجاعها من الكود الأصلي. يوفر بعض القيمة الإضافية على intptr.

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