2012-03-21 6 views
3

Я написал приложение Silverlight, которое работает как загрузчик для S3 Amazon. Он отлично работает на ПК, но на Mac он имеет огромную утечку памяти.Silverlight на Mac - как отладить утечку памяти?

Проблема: я не знаю, как ее отладить. WinDbg, главное предложение Google, очевидно, отсутствует. Я не думаю, что могу получить подсказку изнутри VS (при подключении с помощью удаленной отладки). И я не проверял, но я не думаю, что отладчики Mac OS будут полезны.

Конкретное поведение заключается в том, что при загрузке файла он остается в памяти. Поскольку файлы могут иметь размер в несколько ГБ, они могут использовать всю память и вызывать сбой Silverlight. Я полагаю, это может быть ошибка в Silverlight, но, может быть, я смогу найти обходной путь, если бы я знал точную проблему. В Windows есть также подтвержденная ошибка https://connect.microsoft.com/VisualStudio/feedback/details/674960/writing-to-ms-internal-internalwebrequeststream-deadlocks-when-host-closes-request-stream#details, которую никто не хочет исправлять.

Это то, что я получаю от использования технологии, которая была отклонена ее создателем, я думаю.

ответ

2

Оказалось, что ошибка HttpWebRequest.AllowWriteStreamBuffering = false (или мой обходной путь для Windows) вызывала ужасную утечку памяти (и другие взаимоблокировки) на Mac. Поэтому я был вынужден включить буферизацию. Теперь все работает, за счет дорогостоящего прогресса и отчетности о скорости загрузки.

Жаль, что я не изучил метод индуктивного выяснения этого. Пришлось открыть его более или менее шансом.

+0

AllowWriteStreamBuffering = false вызывает сбой в Mountain Lion, в то время как он определенно не работает - на Snow Leopard. – jayarjo

0

Вы пробовали настроить remote debugging on the mac? Он может не отслеживать утечку памяти, но по крайней мере вы можете пройти через код, чтобы узнать, что происходит.

+0

Я бы сказал, что да, у меня есть. Но я не могу понять, как отлаживать что-то, что не бросает исключение или может наблюдаться только из моих переменных. Но, может быть, есть вызовы GC, которые я могу сделать? Сомнительно в Silverlight из-за безопасности. –

+0

Можете ли вы опубликовать соответствующие части кода? – Bryant

0

Я бы попытался запустить профилировщик, например, SciTek .NET Memory Profiler, в отношении версии Windows и убедиться, что вы правильно распоряжаетесь всеми вашими объектами и фактически не протекаете там. Надеюсь, это правильно переведет Mac. (Большинство программистов очень плохо разбираются в своих объектах. И да, это имеет значение.)

Смежные вопросы