powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Enabling Memory Leak Detection
9 сообщений из 9, страница 1 из 1
Enabling Memory Leak Detection
    #33877960
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MSDN'e говорится: чтобы обнаружить утечки памятивключите в программу след. строки:

Код: plaintext
1.
2.
#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

Директивы #include должны идти в указанном порядке.

Когда программа выполняется под управлением отладчика, _CrtDumpMemoryLeaks отображает информацию об утечках памяти на вкладке Debug окна Output. Эта информация выглядит примерно так:

Код: plaintext
1.
2.
3.
4.
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.


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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Detected memory leaks!
Dumping objects ->
c:\program files\microsoft visual studio .net  2003 \vc7\include\crtdbg.h( 691 ) : { 1294 } normal block at 0x009D60A0,  8  bytes long.
 Data: <        > C8 CD 9D  00   00   00   00   00  
{ 1292 } normal block at 0x009D6050,  15  bytes long.
 Data: <serg1@bzik.org >  73   65   72   67   31   40   62  7A  69  6B 2E 6F  72   67   00  
c:\program files\microsoft visual studio .net  2003 \vc7\include\crtdbg.h( 691 ) : { 1291 } normal block at 0x009DCDC8,  32  bytes long.
 Data: << L             > 3C  15  4C  00   00   00   00   00   00   00   00   00   00   00   00   00  
c:\program files\microsoft visual studio .net  2003 \vc7\include\crtdbg.h( 691 ) : { 1283 } normal block at 0x0038A2C8,  40  bytes long.
 Data: <8VL  h8         >  38   56  4C  00  E0  68   38   00   00   00   09   00   00   00   00   00  

т.е. я вижу что все leaks имели место быть в отладочном модуле crtdbg.h, а мне нужно видеть в моих исходниках.

Кто-нибудь знает в чем здесь дело?
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33878015
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33878187
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
try rational purify

__________________
For more information, please proceed to http://www.ot-e.biz
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33879550
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне как раз и нужно найти в программе утечки памяти, для чего нужно видеть в каких местах происходило ее выделение, а способ описанный в MSDN не дает такой инфы.
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33879988
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел в RSDN:

Имена файлов и номера строк

Как вы уже знаете, в заголовке каждого блока памяти предусмотрено место для хранения имени файла и номера строки, в которой произошло распределение этого блока. Но чтобы туда записались правильные значения, необходимо проделать дополнительную работу. Стандартные версии malloc и new не передают DCRT никаких параметров, кроме размера распределяемого блока. Поэтому в отладочной версии программы лучше всего отказаться от них, заменив их на прямые вызовы функций DCRT.

О замене функций malloc, calloc и т. п. их отладочными эквивалентами заботится заголовочный файл crtdbg.h. Нужно только определить перед его включением макрос _CRTDBG_MAP_ALLOC, который делает активным следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#ifdef  _CRTDBG_MAP_ALLOC

#define malloc(s)      _malloc_dbg(s,_NORMAL_BLOCK,__FILE__,__LINE__)
#define calloc(c,s)    _calloc_dbg(c,s,_NORMAL_BLOCK,__FILE__,__LINE__)
#define realloc(p,s)   _realloc_dbg(p,s,_NORMAL_BLOCK,__FILE__,__LINE__)
#define _expand(p,s)   _expand_dbg(p,s,_NORMAL_BLOCK,__FILE__,__LINE__)
#define free(p)        _free_dbg(p,_NORMAL_BLOCK)
#define _msize(p)      _msize_dbg(p,_NORMAL_BLOCK)

#endif  /* _CRTDBG_MAP_ALLOC */

Об операторе new придётся позаботиться самостоятельно. В DCRT реализована отладочная версия оператора new:

void *operator new(
unsigned int cb,
int nBlockUse,
const char *szFileName,
int nLine
);

Необходимо перенаправить все обращения к new на эту версию. Для этого включите в программу следующий фрагмент.

Код: plaintext
1.
2.
3.
4.
5.
#ifdef _DEBUG
#ifdef _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif /* _CRTDBG_MAP_ALLOC */
#endif /* _DEBUG */

После этого каждый выделяемый в программе блок будет сопровождаться корректной информацией о файле и строке, в которой произошло выделение. Диагностические сообщения DCRT станут более осмысленными, и отладка заметно упростится.

Код: plaintext
1.
2.
ПРЕДУПРЕЖДЕНИЕ

Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33880055
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но стало отображать только утечки в главном модуле ((( а остальные также анонимы
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33880157
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно добавлять в начало каждого модуля:

Код: plaintext
1.
2.
3.
4.
5.
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

или в stdafx.h, но тогда могут возникнуть ошибки, например если пользуется STL или свои перегруженные new
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33880591
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TubrikМне как раз и нужно найти в программе утечки памяти, для чего нужно видеть в каких местах происходило ее выделение, а способ описанный в MSDN не дает такой инфы.


Код: plaintext
IBM® Rational® PurifyPlus™ is a runtime analysis solution designed to help developers write faster, more reliable code. Runtime analysis includes four basic functions: memory corruption detection, memory leak detection, application performance profiling, and code coverage analysis. Rational PurifyPlus packages support for all four of these functions in a single product with a common install and licensing system.
...
Рейтинг: 0 / 0
Enabling Memory Leak Detection
    #33880592
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hell TubrikМне как раз и нужно найти в программе утечки памяти, для чего нужно видеть в каких местах происходило ее выделение, а способ описанный в MSDN не дает такой инфы.


IBM® Rational® PurifyPlus™ is a runtime analysis solution designed to help developers write faster, more reliable code. Runtime analysis includes four basic functions: memory corruption detection, memory leak detection, application performance profiling, and code coverage analysis. Rational PurifyPlus packages support for all four of these functions in a single product with a common install and licensing system.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Enabling Memory Leak Detection
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]