Проблема с отловом утечек памяти
От: Trapper  
Дата: 18.08.04 11:25
Оценка:
Всем привет.

Прочитал статью здесь
Автор(ы): Александр Шаргин
Дата: 27.01.2002


Там предлагается использовать конструкцию

#ifdef _DEBUG
#ifdef _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif /* _CRTDBG_MAP_ALLOC */
#endif /* _DEBUG */


После чего есть предупреждение:
Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.

Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?
Trapper
Re: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 18.08.04 12:32
Оценка:
Здравствуйте, Trapper, Вы писали:

T>Всем привет.


T>Прочитал статью здесь
Автор(ы): Александр Шаргин
Дата: 27.01.2002


T>Там предлагается использовать конструкцию


T>
T>#ifdef _DEBUG
T>#ifdef _CRTDBG_MAP_ALLOC
T>#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
T>#endif /* _CRTDBG_MAP_ALLOC */
T>#endif /* _DEBUG */
T>


T>После чего есть предупреждение:

T>Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.

T>Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?


я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC
(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>?
ты все это сделал и посыпались ошибки?
Re[2]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 18.08.04 12:41
Оценка:
IL>я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC
IL>(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>?
IL>ты все это сделал и посыпались ошибки?


Да, все необходимые действия я уже сделал. Более того, я выяснил, что не компилятся классы, которые объявлены с IMPLEMENT_DYNCREATE. Остальные (даже MFC — шные) компилятся без проблем, и что самое главное, правильно показывают, где происходят утечки памяти.
Trapper
Re[3]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 18.08.04 12:53
Оценка:
Здравствуйте, Trapper, Вы писали:

IL>>я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC

IL>>(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>?
IL>>ты все это сделал и посыпались ошибки?


T>Да, все необходимые действия я уже сделал. Более того, я выяснил, что не компилятся классы, которые объявлены с IMPLEMENT_DYNCREATE. Остальные (даже MFC — шные) компилятся без проблем, и что самое главное, правильно показывают, где происходят утечки памяти.


а какие ошибки получаешь? можешь прислать кусок кода, который не компилится?
Re[4]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 18.08.04 13:13
Оценка:
IL>а какие ошибки получаешь? можешь прислать кусок кода, который не компилится?

Не вопрос!



#ifdef _DEBUG
#ifdef _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif 
#endif 


// CMyDoc

IMPLEMENT_DYNCREATE(CMyDoc, CDocument)


Ошибка в строчке с IMPLEMENT_DYNCREATE
error C2661: 'CObject::operator new' : no overloaded function takes 4 parameters

По всей видимости, это из — за того, что в IMPLEMENT_DYNCREATE используется оператор new, который определён где — то раньше, и принимает другие параметры.
Вопрос в том, что с этим всем делать?
Trapper
Re[5]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 18.08.04 13:26
Оценка:
Здравствуйте, Trapper, Вы писали:

IL>>а какие ошибки получаешь? можешь прислать кусок кода, который не компилится?


T>Не вопрос!



T>

T>#ifdef _DEBUG
T>#ifdef _CRTDBG_MAP_ALLOC
T>#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
T>#endif 
T>#endif 


T>// CMyDoc

T>IMPLEMENT_DYNCREATE(CMyDoc, CDocument)

T>


T>Ошибка в строчке с IMPLEMENT_DYNCREATE

T>error C2661: 'CObject::operator new' : no overloaded function takes 4 parameters

T>По всей видимости, это из — за того, что в IMPLEMENT_DYNCREATE используется оператор new, который определён где — то раньше, и принимает другие параметры.

T>Вопрос в том, что с этим всем делать?

я так понял, что ты добавил
#ifdef _DEBUG
#ifdef _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif 
#endif

в h-файл. этого делать не надо. просто добавь в св-вах проекта на вкладке C/C++/Preprocessor в "Preprocessor Definitions" _CRTDBG_MAP_ALLOC
Re: Проблема с отловом утечек памяти
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 18.08.04 13:35
Оценка:
Здравствуйте, Trapper, Вы писали:

T>Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC


зачем это все, если используешь MFC, в debug-вариантах MFC проектов, по крайней мере созданных мастером, утечки памяти уже отслеживаются
Re[6]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 19.08.04 11:24
Оценка:
IL>я так понял, что ты добавил
IL>
IL>#ifdef _DEBUG
IL>#ifdef _CRTDBG_MAP_ALLOC
IL>#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
IL>#endif 
IL>#endif 
IL>

IL>в h-файл. этого делать не надо. просто добавь в св-вах проекта на вкладке C/C++/Preprocessor в "Preprocessor Definitions" _CRTDBG_MAP_ALLOC


Ты меня правильно понял
Но добавлять эту директиву в проект нельзя — проект сразу перестаёт компилиться
Trapper
Re[7]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 19.08.04 13:06
Оценка:
Здравствуйте, Trapper, Вы писали:

IL>>я так понял, что ты добавил

IL>>
IL>>#ifdef _DEBUG
IL>>#ifdef _CRTDBG_MAP_ALLOC
IL>>#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
IL>>#endif 
IL>>#endif 
IL>>

IL>>в h-файл. этого делать не надо. просто добавь в св-вах проекта на вкладке C/C++/Preprocessor в "Preprocessor Definitions" _CRTDBG_MAP_ALLOC


T>Ты меня правильно понял

T>Но добавлять эту директиву в проект нельзя — проект сразу перестаёт компилиться

вообще-то странно. а не пробовал просто позвать
 _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

из DllMain или (Win)Main или чего там вместо них в MFC?
по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах.
может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.
Re[8]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 19.08.04 13:49
Оценка:
IL>вообще-то странно. а не пробовал просто позвать
IL>
IL> _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
IL>

IL>из DllMain или (Win)Main или чего там вместо них в MFC?
IL>по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах.
IL>может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.


Ты будешь долго смеяться, но я вызываю эту функцию при старте приложения в CMyApp::CMyApp()
Определённый дамп я получаю в окно Output, но без информации о номере строки и имени файла. Проект большой, гадать не хочется
Trapper
Re: Проблема с отловом утечек памяти
От: Burz  
Дата: 19.08.04 14:00
Оценка:
Здравствуйте, Trapper, Вы писали:

T>Всем привет.


T>Прочитал статью здесь
Автор(ы): Александр Шаргин
Дата: 27.01.2002


T>Там предлагается использовать конструкцию


T>
T>#ifdef _DEBUG
T>#ifdef _CRTDBG_MAP_ALLOC
T>#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
T>#endif /* _CRTDBG_MAP_ALLOC */
T>#endif /* _DEBUG */
T>


В MFC уже есть реализация new. Что-то типа:
>#define new(size_t s) new(s, _NORMAL_BLOCK, __FILE__, __LINE__)


Поэтому ничего кроме _CRTDBG_MAP_ALLOC добавлять не надо.
Re[9]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 19.08.04 14:14
Оценка:
Здравствуйте, Trapper, Вы писали:

IL>>вообще-то странно. а не пробовал просто позвать

IL>>
IL>> _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
IL>>

IL>>из DllMain или (Win)Main или чего там вместо них в MFC?
IL>>по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах.
IL>>может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.


T>Ты будешь долго смеяться, но я вызываю эту функцию при старте приложения в CMyApp::CMyApp()

T>Определённый дамп я получаю в окно Output, но без информации о номере строки и имени файла. Проект большой, гадать не хочется

а чего гадать? номер неосвобожденного блока тебе в логе пишут.
поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:

431:       pHead->pBlockHeaderNext = _pFirstBlock;
432:       pHead->pBlockHeaderPrev = NULL;
433:       pHead->szFileName = (char *)szFileName;
434:       pHead->nLine = nLine;
435:       pHead->nDataSize = nSize;
436:       pHead->nBlockUse = nBlockUse;
437:       pHead->lRequest = lRequest; // <--- здесь! lRequest -- это номер блока


условный breakpoint типа "lRequest = 777".
Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.

PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
Re[2]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 20.08.04 06:27
Оценка:
В общем да, может я действительно фигнёй занимаюсь
Trapper
Re[10]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 20.08.04 07:35
Оценка:
IL>а чего гадать? номер неосвобожденного блока тебе в логе пишут.
IL>поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:

IL>
IL>431:       pHead->pBlockHeaderNext = _pFirstBlock;
IL>432:       pHead->pBlockHeaderPrev = NULL;
IL>433:       pHead->szFileName = (char *)szFileName;
IL>434:       pHead->nLine = nLine;
IL>435:       pHead->nDataSize = nSize;
IL>436:       pHead->nBlockUse = nBlockUse;
IL>437:       pHead->lRequest = lRequest; // <--- здесь! lRequest -- это номер блока
IL>


IL>условный breakpoint типа "lRequest = 777".

IL>Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.

IL>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c


Спасибо, не знал про такой способ!
Сижу в дебагере, вернусь не скоро
Trapper
Re[10]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 20.08.04 17:59
Оценка:
Здравствуйте, IamLexa, Вы писали:

IL>а чего гадать? номер неосвобожденного блока тебе в логе пишут.

IL>поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:

IL>
IL>431:       pHead->pBlockHeaderNext = _pFirstBlock;
IL>432:       pHead->pBlockHeaderPrev = NULL;
IL>433:       pHead->szFileName = (char *)szFileName;
IL>434:       pHead->nLine = nLine;
IL>435:       pHead->nDataSize = nSize;
IL>436:       pHead->nBlockUse = nBlockUse;
IL>437:       pHead->lRequest = lRequest; // <--- здесь! lRequest -- это номер блока
IL>


IL>условный breakpoint типа "lRequest = 777".

IL>Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.

IL>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c


А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
Re[11]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 05:53
Оценка:
Здравствуйте, mentor, Вы писали:

IL>>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c


M>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.


Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...)
Так что открывай его, ставь бряк и пользуйся.
Re: Проблема с отловом утечек памяти
От: Аноним  
Дата: 23.08.04 07:55
Оценка: +1
Здравствуйте, Trapper, Вы писали:

T>Всем привет.


T>Прочитал статью здесь
Автор(ы): Александр Шаргин
Дата: 27.01.2002


T>Там предлагается использовать конструкцию


T>
T>#ifdef _DEBUG
T>#ifdef _CRTDBG_MAP_ALLOC
T>#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
T>#endif /* _CRTDBG_MAP_ALLOC */
T>#endif /* _DEBUG */
T>


T>После чего есть предупреждение:

T>Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.

T>Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?


Уважаемый, та статья была написана для проектов, которые не используют MFC. У MFC уже все это есть. Когда вы генерируете любой default MFC project, в код каждого CPP file (исключая stdafx.cpp file) CPP вставляется такая конструкция:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

Этот код и обеспечивает переопределение оператора new и отлов memory leak.
Re[12]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 08:08
Оценка:
Здравствуйте, IamLexa, Вы писали:

M>>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.


IL>Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...)

IL>Так что открывай его, ставь бряк и пользуйся.

А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?
Re[2]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 23.08.04 08:27
Оценка:
А>Уважаемый, та статья была написана для проектов, которые не используют MFC. У MFC уже все это есть. Когда вы генерируете любой default MFC project, в код каждого CPP file (исключая stdafx.cpp file) CPP вставляется такая конструкция:
А>
А>#ifdef _DEBUG
А>#define new DEBUG_NEW
А>#undef THIS_FILE
А>static char THIS_FILE[] = __FILE__;
А>#endif
А>

А>Этот код и обеспечивает переопределение оператора new и отлов memory leak.


Йес, это я уже понял
Trapper
Re[13]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 23.08.04 08:30
Оценка:
Здравствуйте, mentor, Вы писали:

M>Здравствуйте, IamLexa, Вы писали:


M>>>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.


IL>>Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...)

IL>>Так что открывай его, ставь бряк и пользуйся.

M>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?


Хм.. странно. У меня вообще такого сообщения нет. Даже в релизной версии брекпоинт ставится нормально.
Trapper
Re[14]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 08:36
Оценка:
Здравствуйте, Trapper, Вы писали:

M>>>>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.


IL>>>Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...)

IL>>>Так что открывай его, ставь бряк и пользуйся.

M>>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?


T>Хм.. странно. У меня вообще такого сообщения нет. Даже в релизной версии брекпоинт ставится нормально.


Кстати, по поводу этой ошибки, что нет такой перегрузки оператора new которая принимает 4 параметра. Ты ведь с ней сначала столкнулся...
Мне вот что интересно, в этой статье, что ты приводил написано

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

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


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

#ifdef _DEBUG
#ifdef _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif /* _CRTDBG_MAP_ALLOC */
#endif /* _DEBUG */


Может я неправильно понял, но отладочная версия хочет 4 параметра, а define передает ему только 3. Обьясните, в чем я неправ?
Re[13]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 08:39
Оценка:
Здравствуйте, mentor, Вы писали:

M>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?


а ты можешь остановиться на каком-нить операторе new,
и пройти его по шагам в отладчике?
через несколько шагов я оказываюсь в dbgheap.c
Re[15]: Проблема с отловом утечек памяти
От: Trapper  
Дата: 23.08.04 08:43
Оценка:
M>
M>#ifdef _DEBUG
M>#ifdef _CRTDBG_MAP_ALLOC
M>#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
M>#endif /* _CRTDBG_MAP_ALLOC */
M>#endif /* _DEBUG */
M>


M>Может я неправильно понял, но отладочная версия хочет 4 параметра, а define передает ему только 3. Обьясните, в чем я неправ?


Если я не ошибаюсь, ещё надо передать количество байт, которое надо выделить. Но это делается автоматически.
Trapper
Re[14]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 08:54
Оценка:
Здравствуйте, IamLexa, Вы писали:

M>>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?


IL>а ты можешь остановиться на каком-нить операторе new,

IL>и пройти его по шагам в отладчике?
IL>через несколько шагов я оказываюсь в dbgheap.c

Пройтись по шагам могу, но до dbgheap.c он не доходит. Вообще не могу попасть ни в какие файлы за пределами своего проекта, будь то CRT или что то из MFC хотя все исходники есть. Может что то еще надо настроить в среде, не знаю, подскажите.
Re[16]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 08:55
Оценка:
Здравствуйте, Trapper, Вы писали:

M>>Может я неправильно понял, но отладочная версия хочет 4 параметра, а define передает ему только 3. Обьясните, в чем я неправ?


T>Если я не ошибаюсь, ещё надо передать количество байт, которое надо выделить. Но это делается автоматически.


Ясно. Раз автоматически то ладно.
Re[15]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 09:05
Оценка:
Здравствуйте, mentor, Вы писали:

M>Пройтись по шагам могу, но до dbgheap.c он не доходит. Вообще не могу попасть ни в какие файлы за пределами своего проекта, будь то CRT или что то из MFC хотя все исходники есть. Может что то еще надо настроить в среде, не знаю, подскажите.


так сразу не скажу.
1) какая версия VStudio?
2) какая runtime библиотека используется? (в св-вах проекта C/C++ / Code Generation / Runtime Library)
3) где лежат исходники? (каталог)
4) есть pdb-файл для runtime библиотеки? где он лежит?
Re[16]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 09:16
Оценка:
Здравствуйте, IamLexa, Вы писали:

IL>Здравствуйте, mentor, Вы писали:


M>>Пройтись по шагам могу, но до dbgheap.c он не доходит. Вообще не могу попасть ни в какие файлы за пределами своего проекта, будь то CRT или что то из MFC хотя все исходники есть. Может что то еще надо настроить в среде, не знаю, подскажите.


IL>так сразу не скажу.

IL>1) какая версия VStudio?
IL>2) какая runtime библиотека используется? (в св-вах проекта C/C++ / Code Generation / Runtime Library)
IL>3) где лежат исходники? (каталог)
IL>4) есть pdb-файл для runtime библиотеки? где он лежит?

1) VS 6.0
2) Debug Multithreaded DLL
3) E:\Andrew\tracebrowser\src\ (там несколько проектов)
основной E:\Andrew\tracebrowser\src\TraceBrowser\ только зачем это?
4) во втором пункте не написано имя, так что я не знаю, есть ли для этой библиотеке pdb файлик. Но лежат они по идее в "D:\Program Files\Microsoft Visual Studio\VC98\Lib\" во всяком случае какие то pdb там лежат
Re[17]: Проблема с отловом утечек памяти
От: Pavel Dvorkin Россия  
Дата: 23.08.04 09:20
Оценка:
Привет!

mentor wrote:
> 1) VS 6.0
> 2) Debug Multithreaded DLL
> 3) E:\Andrew\tracebrowser\src\ (там несколько проектов)
> основной E:\Andrew\tracebrowser\src\TraceBrowser\ только зачем это?
> 4) во втором пункте не написано имя, так что я не знаю, есть ли для этой библиотеке pdb файлик. Но лежат они по идее в "D:\Program Files\Microsoft Visual Studio\VC98\Lib\" во всяком случае какие то pdb там лежат

Попробуй переустановить SP6 для VC

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[17]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 09:32
Оценка:
Здравствуйте, mentor, Вы писали:

M>1) VS 6.0

жаль. у меня 7.1

M>2) Debug Multithreaded DLL

значит используется msvcrt???.dll. вот только не знаю какая
наверно msvcrt60d.dll. лежать она должна в %WINDIR%\System32\ там же должен быть и pdb для нее.
есть такое?
когда под отладчиком загружается твой проект -- в окошке Output должно быть написано что-то типа
Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
Loaded 'C:\WINDOWS\system32\msvcrt???.dll', No symbols loaded.
есть там что-то подобное?

M>3) E:\Andrew\tracebrowser\src\ (там несколько проектов)

M>основной E:\Andrew\tracebrowser\src\TraceBrowser\ только зачем это?
сорри. я имел в виду -- где лежат исходники runtime библиотеки?

M>4) во втором пункте не написано имя, так что я не знаю, есть ли для этой библиотеке pdb файлик. Но лежат они по идее в "D:\Program Files\Microsoft Visual Studio\VC98\Lib\" во всяком случае какие то pdb там лежат

ищи в %WINDIR%\System32\
Re[18]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 09:43
Оценка:
Здравствуйте, IamLexa, Вы писали:

M>>1) VS 6.0

IL>жаль. у меня 7.1

M>>2) Debug Multithreaded DLL

IL>значит используется msvcrt???.dll. вот только не знаю какая
IL>наверно msvcrt60d.dll. лежать она должна в %WINDIR%\System32\ там же должен быть и pdb для нее.
IL>есть такое?
IL>когда под отладчиком загружается твой проект -- в окошке Output должно быть написано что-то типа
IL>Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
IL>Loaded 'C:\WINDOWS\system32\msvcrt???.dll', No symbols loaded.
IL>есть там что-то подобное?

M>>3) E:\Andrew\tracebrowser\src\ (там несколько проектов)

M>>основной E:\Andrew\tracebrowser\src\TraceBrowser\ только зачем это?
IL>сорри. я имел в виду -- где лежат исходники runtime библиотеки?

M>>4) во втором пункте не написано имя, так что я не знаю, есть ли для этой библиотеке pdb файлик. Но лежат они по идее в "D:\Program Files\Microsoft Visual Studio\VC98\Lib\" во всяком случае какие то pdb там лежат

IL>ищи в %WINDIR%\System32\

2) есть msvcrtd.dll
3) исходники в "D:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\"
4) да, там лежит такая библеотека и pdb для нее. еще есть msvcrt.dll с pdb и еще msvcrt10(20, 40).dll они без pdb
Re[18]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 09:44
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>mentor wrote:

>> 1) VS 6.0
>> 2) Debug Multithreaded DLL
>> 3) E:\Andrew\tracebrowser\src\ (там несколько проектов)
>> основной E:\Andrew\tracebrowser\src\TraceBrowser\ только зачем это?
>> 4) во втором пункте не написано имя, так что я не знаю, есть ли для этой библиотеке pdb файлик. Но лежат они по идее в "D:\Program Files\Microsoft Visual Studio\VC98\Lib\" во всяком случае какие то pdb там лежат

PD>Попробуй переустановить SP6 для VC


А кстати, у меня походу наверное вообще SP ни одного не стоит. Что, надо поставить шестой? Постараюсь найти...
Re[19]: Проблема с отловом утечек памяти
От: Pavel Dvorkin Россия  
Дата: 23.08.04 09:49
Оценка:
Привет!

mentor wrote:
>
> Здравствуйте, Pavel Dvorkin, Вы писали:

> А кстати, у меня походу наверное вообще SP ни одного не стоит. Что, надо поставить шестой? Постараюсь найти...


Лучше поставить

http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp6/default.aspx

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[19]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 09:55
Оценка:
Здравствуйте, mentor, Вы писали:

M>2) есть msvcrtd.dll

M>3) исходники в "D:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\"
M>4) да, там лежит такая библеотека и pdb для нее. еще есть msvcrt.dll с pdb и еще msvcrt10(20, 40).dll они без pdb

RE:
когда под отладчиком загружается твой проект -- в окошке Output должно быть написано что-то типа
Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
Loaded 'C:\WINDOWS\system32\msvcrt???.dll', No symbols loaded.
есть там что-то подобное?
хочется понять -- кого твой проект грузит

кстати,
IL>а ты можешь остановиться на каком-нить операторе new,
IL>и пройти его по шагам в отладчике?
IL>через несколько шагов я оказываюсь в dbgheap.c

M>Пройтись по шагам могу,


если ты входишь в оператор new -- VStudio тебе показывает окошко Disassembler'а?
там кажись в контекстном меню был пункт "Go to Source code..."
-- там VStudio не предлагает указать, где лежит исходник из CRT?
Re[20]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 10:02
Оценка:
Здравствуйте, IamLexa, Вы писали:


M>>2) есть msvcrtd.dll

M>>3) исходники в "D:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\"
M>>4) да, там лежит такая библеотека и pdb для нее. еще есть msvcrt.dll с pdb и еще msvcrt10(20, 40).dll они без pdb

IL>RE:

IL>когда под отладчиком загружается твой проект -- в окошке Output должно быть написано что-то типа
вот такая строчка есть
IL>Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
и есть строчка для msvcrtd.dll
IL>Loaded 'C:\WINDOWS\system32\msvcrt???.dll', No symbols loaded.
больше для msvcrt*.dll строчек нет

IL>есть там что-то подобное?

IL>хочется понять -- кого твой проект грузит

IL>кстати,

IL>>а ты можешь остановиться на каком-нить операторе new,
IL>>и пройти его по шагам в отладчике?
IL>>через несколько шагов я оказываюсь в dbgheap.c

M>>Пройтись по шагам могу,


IL>если ты входишь в оператор new -- VStudio тебе показывает окошко Disassembler'а?

IL>там кажись в контекстном меню был пункт "Go to Source code..."
IL>-- там VStudio не предлагает указать, где лежит исходник из CRT?
Нет, окошка дизассемблера нет. Просто у меня new используется для создания экземпляров классов, вызывается соответственно конструктор и все.
Re[21]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 10:34
Оценка:
Здравствуйте, mentor, Вы писали:

IL>>когда под отладчиком загружается твой проект -- в окошке Output должно быть написано что-то типа

M>вот такая строчка есть
IL>>Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
M>и есть строчка для msvcrtd.dll

значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb.
оба этих файла лежат в System32 и даты у них совпадают?

кстати, идея поставить SP -- оч. правильная.
это должно помочь.
Re[22]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 10:37
Оценка:
Здравствуйте, IamLexa, Вы писали:

IL>>>когда под отладчиком загружается твой проект -- в окошке Output должно быть написано что-то типа

M>>вот такая строчка есть
IL>>>Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded.
M>>и есть строчка для msvcrtd.dll

IL>значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb.

IL>оба этих файла лежат в System32 и даты у них совпадают?

Лежат оба. Но даты совсем не совпадают. dll 2003 год а pdb 1998 — го года

IL>кстати, идея поставить SP -- оч. правильная.

IL>это должно помочь.

Это попробую конечно. Но пока еще в сетке локальной его не нашел. Что то 70 мег качать с инета так сразу не очень охота.
Re[23]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 10:47
Оценка: 2 (1)
Здравствуйте, mentor, Вы писали:

IL>>значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb.

IL>>оба этих файла лежат в System32 и даты у них совпадают?

M>Лежат оба. Но даты совсем не совпадают. dll 2003 год а pdb 1998 — го года


по всей видимости они у тебя разъехались. кто-то положил новую dll, а pdb к ней не обновил.
можешь попробовать найти на диске VStudio файлы msvcrtd.dll и msvcrtd.pdb и скопировать их в System32.
ну или может кто-нить тебе их пришлет.

PS.
а если это не критично -- можно в проекте использовать статическую runtime library.
Re[24]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 11:02
Оценка:
Здравствуйте, IamLexa, Вы писали:

IL>>>значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb.

IL>>>оба этих файла лежат в System32 и даты у них совпадают?

M>>Лежат оба. Но даты совсем не совпадают. dll 2003 год а pdb 1998 — го года


IL>по всей видимости они у тебя разъехались. кто-то положил новую dll, а pdb к ней не обновил.

IL>можешь попробовать найти на диске VStudio файлы msvcrtd.dll и msvcrtd.pdb и скопировать их в System32.
IL>ну или может кто-нить тебе их пришлет.

Я так подозреваю, что dll-ки шли в поставке вместе с виндой, и потому при установке студии не были заменены более старыми с диска, а pdb-ки как раз те, что на диске студии. Так что мне, скоперовать более старые dll-ки?

IL>PS.

IL>а если это не критично -- можно в проекте использовать статическую runtime library.
Re[25]: Проблема с отловом утечек памяти
От: IamLexa  
Дата: 23.08.04 11:12
Оценка:
Здравствуйте, mentor, Вы писали:

M>Здравствуйте, IamLexa, Вы писали:


IL>>>>значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb.

IL>>>>оба этих файла лежат в System32 и даты у них совпадают?

M>>>Лежат оба. Но даты совсем не совпадают. dll 2003 год а pdb 1998 — го года


IL>>по всей видимости они у тебя разъехались. кто-то положил новую dll, а pdb к ней не обновил.

IL>>можешь попробовать найти на диске VStudio файлы msvcrtd.dll и msvcrtd.pdb и скопировать их в System32.
IL>>ну или может кто-нить тебе их пришлет.

M>Я так подозреваю, что dll-ки шли в поставке вместе с виндой, и потому при установке студии не были заменены более старыми с диска, а pdb-ки как раз те, что на диске студии. Так что мне, скоперовать более старые dll-ки?


странно. не знал, что винда ставит дебаг-версию msvcrtd.dll
да, я бы скопировал более старую msvcrtd.dll -- чтобы она соответсвовала pdb-шке.
Re[26]: Проблема с отловом утечек памяти
От: mentor Россия  
Дата: 23.08.04 11:29
Оценка:
Здравствуйте, IamLexa, Вы писали:

IL>>>>>значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb.

IL>>>>>оба этих файла лежат в System32 и даты у них совпадают?

M>>>>Лежат оба. Но даты совсем не совпадают. dll 2003 год а pdb 1998 — го года


IL>>>по всей видимости они у тебя разъехались. кто-то положил новую dll, а pdb к ней не обновил.

IL>>>можешь попробовать найти на диске VStudio файлы msvcrtd.dll и msvcrtd.pdb и скопировать их в System32.
IL>>>ну или может кто-нить тебе их пришлет.

M>>Я так подозреваю, что dll-ки шли в поставке вместе с виндой, и потому при установке студии не были заменены более старыми с диска, а pdb-ки как раз те, что на диске студии. Так что мне, скоперовать более старые dll-ки?


IL>странно. не знал, что винда ставит дебаг-версию msvcrtd.dll

IL>да, я бы скопировал более старую msvcrtd.dll -- чтобы она соответсвовала pdb-шке.

Может конечно и не винда, какая нибудь другая прога свои прописала библиотеки. Во всяком случае мне замена помогла. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.