2012-04-18 4 views
0

У меня есть код на C#. Я использую анализ кода, чтобы найти все места, где я не использую using(){} или не вызывать dispose. Это сделано. Но он все еще течет. Код не вызывает DllImport, кроме двух функций (SetWindowPos, SetForegroundWindow), но они никогда не вызываются (основной экземпляр не использует его. Другой экземпляр делает, но они живут в течение нескольких секунд).Как найти то, что протекает в C#?

Как-то этот код протекает. Как узнать, в чем проблема?

+0

Что заставляет вас думать, что код протекает в памяти? И ваш заголовок и вопрос упоминает '[C#]', но ваши теги говорят '[C++]'. Является ли C++ релевантным здесь? –

+0

Может ли кто-нибудь объяснить мне, почему это не настоящий вопрос? @Insilico: C++ был опечаткой. (надеюсь, что ключевое слово 'use' и тегирование .NET сделали это понятным). Что заставляет меня думать о его утечке? Тот факт, что он доходит до 1,5 ГБ в памяти и выдает исключение из памяти, заставляет меня думать о его утечке. Раньше я никогда не видел, чтобы он шел больше 80 МБ. –

ответ

6

Утечки памяти в управляемом коде обычно связаны с хранением объектов в памяти с помощью непреднамеренной ссылки. Здесь важны лица, занимающиеся обработкой данных.

Вы захотите получить инструмент профилирования памяти. SciTech's .NET Memory Profiler, вероятно, лучший, хотя JetBrains' dotTrace и RedGate's ANTS также оба хороши.

У Microsoft есть бесплатный инструмент для профилирования, CLR Profiler, который может быть использован, хотя это немного сложнее. См. here и here для получения некоторых рекомендаций.

DRONE profiler for .NET, похоже, имеет бесплатную персональную лицензию, хотя я сам не знаком с инструментом. У них есть статья об обнаружении утечек памяти со своим профилировщиком here.

В более высоких версиях Visual Studio также имеются инструменты профилирования. MSDN содержит documentation on how to use them.

+0

Спасибо, я соглашусь, когда найду виновника проблемы –

+0

Получается, что у меня был цикл for, который никогда не заканчивался, ставя страницу i в список до исключения памяти , У меня было 'continue', забывая, что цикл был списком ссылок, и я должен его увеличивать. Я переписал его, чтобы я увеличил его на 2-й строке цикла (сначала создаем ptr/ref для текущей ссылки). В нем есть сон(), поэтому потребовалось много минут и не использовало никакого процессора, прежде чем я его заметлю. Его также на другой поток (nonmain). тьфу, ошибки. –

+0

oops Я имел в виду цикл while. Я использовал SciTech .NET Memory Profiler, потратил некоторое время на выяснение того, как его использовать, и использовал «память» для отслеживания проблемы. –

1

Профилируйте свое приложение, используя профайлер, встроенный в Visual Studio (Premium и Ultimate), или инвестируйте в такой инструмент, как ANTS.

+0

+1. У меня есть доступ к VS с указанным профилировщиком. Я не понимал, что имеет профилирование памяти, поскольку я использую C++ большую часть времени (что я никогда не просачиваю, а их профилировщик C++ не делает IIRC). Я соглашусь, когда я отслежу проблему –