Вызвать сбой процесса при большом выделении памяти - PullRequest
4 голосов
/ 12 апреля 2010

Я пытаюсь найти значительную утечку памяти (15 МБ за раз, но делаю такое распределение в нескольких местах). Я проверил наиболее очевидные места, а затем использовал AQTime, но я все еще не могу точно определить его. Теперь я вижу 2 варианта:

1) Использовать SetProcessWorkingSetSize: я пробовал это, но мой процесс успешно продолжается при использовании более 150 МБ:

DWORD MemorySize = 150*1024*1024;
SetProcessWorkingSetSize( GetCurrentProcess(), MemorySize/2, MemorySize*2 );

2) Установите точку останова при выделении более 1 МБ за раз. Как мне это сделать, перегрузить оператор new с 'if> 1MB' внутри?

Ответы [ 6 ]

1 голос
/ 13 апреля 2010

Из ваших тегов вы используете c ++ и visual studio.

В этом случае вы можете просто использовать крюки отладки crt, которые Microssoft предоставляет для вас.

Поиск msdn для _CrtSetAllocHook.

В отладочной сборке это позволит вам перехватывать каждое распределение - вы можете игнорировать маленькие и просто установить точку останова или вызвать :: DebugBreak для больших.

1 голос
/ 12 апреля 2010

SetProcessWorkingSetSize не означает, что вы думаете, что это означает, - это подсказка ОС о том, сколько памяти оставить «в памяти» по сравнению с записью на диск. Современные операционные системы очень агрессивны, когда дело касается подкачки неиспользуемой памяти на диск, особенно Windows.

IBM Rational Purify - это ваше единственное решение, кроме тщательного анализа кода. В Windows для C / C ++ нет лучшего инструмента для поиска утечек памяти. На Mac или Linux вы могли бы использовать valgrind, но AFAIK, он еще не работает на Windows.

0 голосов
/ 17 апреля 2010

Извините, ни одно из предложенных решений не сработало. Наконец-то это было исправлено с помощью AQTime и большого количества отладочных данных. Утечка была устранена при отключении, поэтому она искала иголку в стоге сена.

Тем не менее, меня интересует, как эффективно это найти. Я попытался поставить условную точку останова на новом операторе, но отладчику потребовались годы, чтобы оценить «байты> 1024 * 1024» для каждого отдельного выделения.

0 голосов
/ 12 апреля 2010

Попробуйте использовать UMDH . Это бесплатная утилита Microsoft, которая позволяет обнаруживать утечки памяти.

0 голосов
/ 12 апреля 2010

В системе со встроенным типом мы будем делать в точности так, как вы предлагаете - ставить перерыв при любом вызове new / memAlloc выше определенного порога и делать то же самое при free / delete Утомительно, но это сделает работу. Условная точка останова для размера должна делать то, что вы хотите, но при удалении это немного хуже.

0 голосов
/ 12 апреля 2010

1) Использовать SetProcessWorkingSetSize: я пробовал это, но мой процесс успешно продолжается при использовании более 150 МБ:

Что возвращает SetProcessWorkingSetSize? Успешен ли вызов?

2) Установите точку останова при выделении более 1 МБ за раз. Как мне это сделать, перегрузить оператор new с 'if> 1MB' внутри?
Да, это должно работать.

Может быть полезно изучить инструменты, предоставляемые C Runtime Heap Debug Heap , предоставляемой MSVC.

...