Войти
ПрограммированиеПодсказкиОбщееОбщее

Поиск Memory Leaks в VisualStudio

Автор:

Поиск и устранение утечек памяти в Visual Studio.

Найти утечки памяти в программе можно следующим способом:

Первое что следует сделать:

В заголовочный файл который включается всеми другими файлами(например "stdafx.h") в начало нужно поместить следующие строки:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

Этим мы заменяем функции malloc и free другими malloc_dbg и free_dbg, которые будут выполнять проверки.
Затем в функцию, где начинается работа программы(WinMain()) в начало добавляем следующее:

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

Благодаря этой функции после возвращения вашей программой контроля системе, все утечки памяти будут напечатаны в окне Output в следующем виде:

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

В фигурных скобках показывается номер выделения памяти, которая не была удалена.

Можно перейти к месту в коде, где прошло выделение памяти по двойному клику на строчке
  C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
, но обычно это не сильно помогает.

Также можно изменить место, куда будет писаться информация об утечках с помощью функции _CrtSetReportMode (см. MSDN)

Теперь переходим ко второй части - избавление от утечек:
В начало функции, где начинается работа программы нужно добавить:

_CrtSetBreakAlloc(num); // где num - номер утечки
после этого запустить Debug режим.

В момент выделения вылетит окошко с ошибкой ("User breakpoint").

Нужно нажать кнопку break и перемещаться вверх в окне Call Stack до вашей функции, которая вызвала выделение неудалённой памяти.

#C++, #память

12 октября 2009 (Обновление: 11 июня 2010)

Комментарии [18]

Страницы: 1 2 Следующая »
#1
17:24, 29 дек. 2009

Есть хорошая библиотека для студии, Visual Leak Detector. В общем, надо только заголовок вставить и вместе с lib откомпилить.

#2
17:42, 30 дек. 2009

и можно приписать ещё такое

#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
что бы и new тож нормально отслеживался.

ток же можно перенаправить вывод в файл, бо Output не всегда удобно

HANDLE hLogFile;

_CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_WARN, hLogFile);
_CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ERROR, hLogFile);
_CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile (_CRT_ASSERT, hLogFile);

#3
19:38, 30 дек. 2009

Visual Leak Detector отличная вещь, но тормозная. Кстати new нормально обрабатывает и стек сразу показывает. В указанном методе смущает потенциальная сложность повторения codepath, чтобы сохранился номер блока

#4
11:13, 31 дек. 2009

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

#5
19:54, 31 дек. 2009

MarkoPolo
> Она тормозит,
кто? Visual Leak Detector??

#6
23:50, 1 янв. 2010

MarkoPolo
> Она тормозит, лишь выдавая результаты анализа и тем дольше, чем больше дырок
> сделали.
ну да, конечно... попробуй поставить глубину стека хотя бы 10 и подключить vld к проекту на 150 000 строк, использующему какой-нибудь wxWidgets... там просто запуск проги превращается плавно в чаепитие...

Зато утечки ищет замечательно

#7
1:06, 2 янв. 2010

jaxon
Таки подключи заголовок позже...

#8
2:08, 2 янв. 2010

MarkoPolo
> Таки подключи заголовок позже...
эм... то есть?

#9
16:45, 2 янв. 2010

jaxon
В общем, ступил.

#10
15:17, 11 июня 2010
#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)

inline void *__cdecl operator new(size_t _size, const char *_file_name, int _line)
{
  return ::operator new(_size, 1,  _file_name, _line);
}

#define _DEBUG_NEW new(__FILE__, __LINE__)
#define new _DEBUG_NEW
#endif

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF |
                         _CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_DELAY_FREE_MEM_DF);
Прошло более 7 месяцев
#11
21:05, 25 янв. 2011

а у меня почему-то не работает, в который раз пробую и всё равно не работает

может директХ скомпилированный в режиме отладки мешает?

#12
23:50, 25 янв. 2011

а ну его,
народ, скажите лучше а Visual Leak Detector 2.0b в 2008-й студии у вас работает?

#13
12:28, 26 янв. 2011

Barbar1an
в 2010 работает. в 2008 - хз :)))

#14
13:02, 26 янв. 2011

Всё работает, студия тут совсем не при чём, дамп пишется в текстовый файл, можно читать вручную, а можно накостылить на перле или питоне пару скриптов для анализа лога, сортировки по убыванию и группировки по размеру.

Страницы: 1 2 Следующая »
ПрограммированиеПодсказкиОбщееОбщее

Тема в архиве.