Еще про Debug CRT
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.12.01 04:44
Оценка:
Опять же по статье Обнаружение и локализация утечек памяти
Автор(ы): Эдвард Райт

Статья посвящена проблеме, которая постоянно преследует программистов на C/C++, — обнаружению и локализации утечек памяти. Автор демонстрирует применение средств библиотеки времени выполнения (CTR), поставляемой с Visual C++, с помощью которых утечки памяти можно устранить гораздо быстрее и проще, чем методом "пристального взгляда".


Проект — dll без MFC. Добавляю
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>


в DllMain вставляю
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );


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

Detected memory leaks!
Dumping objects ->
e:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {171} normal block at 0x010C9008, 50 bytes long.
Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD


Как заставить отображаться имя файла и номер строки места выделения памяти в моем файле, как это нарисовано в статье?
Re: Еще про Debug CRT
От: Alex Fedotov США  
Дата: 11.12.01 05:10
Оценка: 18 (2)
Здравствуйте Odi$$ey, Вы писали:

O$>Опять же по статье Обнаружение и локализация утечек памяти
Автор(ы): Эдвард Райт

Статья посвящена проблеме, которая постоянно преследует программистов на C/C++, — обнаружению и локализации утечек памяти. Автор демонстрирует применение средств библиотеки времени выполнения (CTR), поставляемой с Visual C++, с помощью которых утечки памяти можно устранить гораздо быстрее и проще, чем методом "пристального взгляда".


O$>Проект — dll без MFC. Добавляю
O$>
O$>#define _CRTDBG_MAP_ALLOC
O$>#include <stdlib.h>
O$>#include <crtdbg.h>
O$>


O$>в DllMain вставляю
O$>
O$>_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );
O$>


O$>в одной из экспортируемых функций выделяю по new , но не освобождаю память, в конце программы получаю:

O$>
O$>Detected memory leaks!
O$>Dumping objects ->
O$>e:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {171} normal block at 0x010C9008, 50 bytes long.
O$>Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
O$>


O$>Как заставить отображаться имя файла и номер строки места выделения памяти в моем файле, как это нарисовано в статье?

Ты operator new используешь, верно? Попробуй добавить нечто вроде

#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
#    define _DEBUG_NEW new(__FILE__, __LINE__)
#    define new _DEBUG_NEW
#endif
-- Alex Fedotov
Re[2]: Еще про Debug CRT
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.12.01 06:03
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Ты operator new используешь, верно? Попробуй добавить нечто вроде


AF>
AF>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
AF>    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
AF>    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
AF>#    define _DEBUG_NEW new(__FILE__, __LINE__)
AF>#    define new _DEBUG_NEW
AF>#endif
AF>


Все ОК, за исключением небольшой очипатки — lpszFileName вместо pszFileName (или наоборот).
Как я понял, если надо отследить malloc над ним надо надругаться аналогичным образом?
Re[3]: Еще про Debug CRT
От: Alex Fedotov США  
Дата: 11.12.01 06:11
Оценка:
Здравствуйте Odi$$ey, Вы писали:

O$>Здравствуйте Alex Fedotov, Вы писали:

AF>>Ты operator new используешь, верно? Попробуй добавить нечто вроде


AF>>
AF>>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
AF>>    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
AF>>    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
AF>>#    define _DEBUG_NEW new(__FILE__, __LINE__)
AF>>#    define new _DEBUG_NEW
AF>>#endif
AF>>


O$>Все ОК, за исключением небольшой очипатки — lpszFileName вместо pszFileName (или наоборот).
O$>Как я понял, если надо отследить malloc над ним надо надругаться аналогичным образом?

malloc и так должен работать нормально. Посмотри внимательно определения в crtdbg.h по этому поводу, сразу поймешь в чем дело.
-- Alex Fedotov
Re[4]: Еще про Debug CRT
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.12.01 06:44
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>malloc и так должен работать нормально. Посмотри внимательно определения в crtdbg.h по этому поводу, сразу поймешь в чем дело.


Посмотрел. Так этот crtdbg.h надо вставлять в каждый cpp чтобы срабатывали __FILE__ __LINE__ ?
Re[5]: Еще про Debug CRT
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 11.12.01 06:58
Оценка:
O$>Посмотрел. Так этот crtdbg.h надо вставлять в каждый cpp чтобы срабатывали __FILE__ __LINE__ ?

Уже проверил, можно и через stdafx.h.
Re[2]: Еще про Debug CRT
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.05.02 13:52
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте Odi$$ey, Вы писали:


AF>Ты operator new используешь, верно? Попробуй добавить нечто вроде


AF>
AF>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
AF>    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
AF>    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
AF>#    define _DEBUG_NEW new(__FILE__, __LINE__)
AF>#    define new _DEBUG_NEW
AF>#endif
AF>


Подскажите, куда это пихать надо? Если до <ctrdbg.h> то она ругается само собой, а если после вставляю — ни фига не проходит, всё тот же crtdbg.h показывает, тварь.
Re[3]: Еще про Debug CRT
От: Аноним  
Дата: 29.08.02 12:10
Оценка:
Здравствуйте Курилка, Вы писали:

К>Здравствуйте Alex Fedotov, Вы писали:


AF>>Здравствуйте Odi$$ey, Вы писали:


AF>>Ты operator new используешь, верно? Попробуй добавить нечто вроде


AF>>
AF>>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
AF>>    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
AF>>    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
AF>>#    define _DEBUG_NEW new(__FILE__, __LINE__)
AF>>#    define new _DEBUG_NEW
AF>>#endif
AF>>


К>Подскажите, куда это пихать надо? Если до <ctrdbg.h> то она ругается само собой, а если после вставляю — ни фига не проходит, всё тот же crtdbg.h показывает, тварь.




Нет ну а вопрос то открытый :???:
Есть еще средства?
Re[4]: Еще про Debug CRT
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 30.08.02 04:55
Оценка:
Здравствуйте Аноним, Вы писали:

А>Нет ну а вопрос то открытый


да нет, вроде закрылся, вот из последнего проекта (VC7):

в конце stdafx.h

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>


в начале main :

    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


все утечки, в т.ч. и по new отслеживаются.
Re[3]: Еще про Debug CRT
От: ~Yuriy~ www.inspira.by.ru
Дата: 30.08.02 07:02
Оценка:
Здравствуйте Odi$$ey, Вы писали:

O$>Здравствуйте Alex Fedotov, Вы писали:

AF>>Ты operator new используешь, верно? Попробуй добавить нечто вроде


AF>>
AF>>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
AF>>    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
AF>>    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
AF>>#    define _DEBUG_NEW new(__FILE__, __LINE__)
AF>>#    define new _DEBUG_NEW
AF>>#endif
AF>>


O$>Все ОК, за исключением небольшой очипатки — lpszFileName вместо pszFileName (или наоборот).
O$>Как я понял, если надо отследить malloc над ним надо надругаться аналогичным образом?

// ------------------------------------------------------------------------------------------

The Debug Heap from C++

The Debug versions of the C run-time library contain Debug versions of the C++ new and delete operators. If your C++ code defines _CRTDBG_MAP_ALLOC, all instances of new are mapped to the Debug version, which records source file and line number information.

If you want to use the _CLIENT_BLOCK allocation type, do not define _CRTDBG_MAP_ALLOC. Instead, you must call the Debug version of the new operator directly or create macros that replace the new operator in debug mode, as shown in the following example:


/* MyDbgNew.h
 Defines global operator new to allocate from
 client blocks
*/

#ifdef _DEBUG
   #define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
   #define DEBUG_CLIENTBLOCK
#endif // _DEBUG


/* MyApp.cpp
   Compile options needed: /Zi /D_DEBUG /MLd
 *            or use a
 *      Default Workspace for a Console Application to
 *      build a Debug version
*/

#include "crtdbg.h"
#include "mydbgnew.h"

#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif

void main( )   {
   char *p1;
   p1 =  new char[40];
   _CrtMemDumpAllObjectsSince( NULL );
 }


The Debug version of the delete operator works with all block types and requires no changes in your program when you compile a Release version.
Re[2]: Еще про Debug CRT
От: denisov  
Дата: 30.08.02 12:44
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте Odi$$ey, Вы писали:


O$>>Опять же по статье Обнаружение и локализация утечек памяти
Автор(ы): Эдвард Райт

Статья посвящена проблеме, которая постоянно преследует программистов на C/C++, — обнаружению и локализации утечек памяти. Автор демонстрирует применение средств библиотеки времени выполнения (CTR), поставляемой с Visual C++, с помощью которых утечки памяти можно устранить гораздо быстрее и проще, чем методом "пристального взгляда".
;)

O$>>Проект — dll без MFC. Добавляю
O$>>
O$>>#define _CRTDBG_MAP_ALLOC
O$>>#include <stdlib.h>
O$>>#include <crtdbg.h>
O$>>


O$>>в DllMain вставляю
O$>>
O$>>_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF );
O$>>


O$>>в одной из экспортируемых функций выделяю по new , но не освобождаю память, в конце программы получаю:

O$>>
O$>>Detected memory leaks!
O$>>Dumping objects ->
O$>>e:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {171} normal block at 0x010C9008, 50 bytes long.
O$>>Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
O$>>


O$>>Как заставить отображаться имя файла и номер строки места выделения памяти в моем файле, как это нарисовано в статье?

AF>Ты operator new используешь, верно? Попробуй добавить нечто вроде


AF>
AF>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
AF>    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
AF>    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
AF>#    define _DEBUG_NEW new(__FILE__, __LINE__)
AF>#    define new _DEBUG_NEW
AF>#endif
AF>



Можно ли сделать нечто подобное для собственных классов:

class A;

A *ptr=new A;
Re[2]: Еще про Debug CRT
От: Sergey Россия  
Дата: 30.08.02 13:44
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Ты operator new используешь, верно? Попробуй добавить нечто вроде


AF>
AF>#if defined(_DEBUG) && defined(_CRTDBG_MAP_ALLOC) && defined(__cplusplus) && !defined(_DEBUG_NEW)
AF>    inline void* __cdecl operator new(size_t nSize, const char * pszFileName, int nLine)
AF>    {    return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine); }
AF>#    define _DEBUG_NEW new(__FILE__, __LINE__)
AF>#    define new _DEBUG_NEW
AF>#endif
AF>


Если я все правильно понял, не слишком здорово выйдет: placement-форма new исчезнет.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.