Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Подсказки / Поиск Memory Leaks в VisualStudio

Поиск 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 до вашей функции, которая вызвала выделение неудалённой памяти.

12 октября 2009

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


Обновление: 11 июня 2010

Комментарии:
Страницы: 1 2 Следующая »
MarkoPoloПостоялецwww29 дек. 200917:24#1
Есть хорошая библиотека для студии, Visual Leak Detector. В общем, надо только заголовок вставить и вместе с lib откомпилить.
SmoukingПостоялецwww30 дек. 200917:42#2
и можно приписать ещё такое
#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);

serpinfПостоялецwww30 дек. 200919:38#3
Visual Leak Detector отличная вещь, но тормозная. Кстати new нормально обрабатывает и стек сразу показывает. В указанном методе смущает потенциальная сложность повторения codepath, чтобы сохранился номер блока
MarkoPoloПостоялецwww31 дек. 200911:13#4
Она тормозит, лишь выдавая результаты анализа и тем дольше, чем больше дырок сделали.
SmoukingПостоялецwww31 дек. 200919:54#5
MarkoPolo
> Она тормозит,
кто? Visual Leak Detector??
serpinfПостоялецwww1 янв. 201023:50#6
MarkoPolo
> Она тормозит, лишь выдавая результаты анализа и тем дольше, чем больше дырок
> сделали.
ну да, конечно... попробуй поставить глубину стека хотя бы 10 и подключить vld к проекту на 150 000 строк, использующему какой-нибудь wxWidgets... там просто запуск проги превращается плавно в чаепитие...

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

MarkoPoloПостоялецwww2 янв. 20101:06#7
jaxon
Таки подключи заголовок позже...
serpinfПостоялецwww2 янв. 20102:08#8
MarkoPolo
> Таки подключи заголовок позже...
эм... то есть?
MarkoPoloПостоялецwww2 янв. 201016:45#9
jaxon
В общем, ступил.
АлмазПостоялецwww11 июня 201015:17#10
#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);

Barbar1anПостоялецwww25 янв. 201121:05#11
а у меня почему-то не работает, в который раз пробую и всё равно не работает

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

Barbar1anПостоялецwww25 янв. 201123:50#12
а ну его,
народ, скажите лучше а Visual Leak Detector 2.0b в 2008-й студии у вас работает?
GurichПостоялецwww26 янв. 201112:28#13
Barbar1an
в 2010 работает. в 2008 - хз :)))
kvakvsПостоялецwww26 янв. 201113:02#14
Всё работает, студия тут совсем не при чём, дамп пишется в текстовый файл, можно читать вручную, а можно накостылить на перле или питоне пару скриптов для анализа лога, сортировки по убыванию и группировки по размеру.
Страницы: 1 2 Следующая »

/ Форум / Программирование игр / Общее

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

2001—2017 © GameDev.ru — Разработка игр