После чего есть предупреждение:
Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.
Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?
T>После чего есть предупреждение: T>Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.
T>Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?
я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC
(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>?
ты все это сделал и посыпались ошибки?
IL>я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC IL>(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>? IL>ты все это сделал и посыпались ошибки?
Да, все необходимые действия я уже сделал. Более того, я выяснил, что не компилятся классы, которые объявлены с IMPLEMENT_DYNCREATE. Остальные (даже MFC — шные) компилятся без проблем, и что самое главное, правильно показывают, где происходят утечки памяти.
Здравствуйте, Trapper, Вы писали:
IL>>я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC IL>>(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>? IL>>ты все это сделал и посыпались ошибки?
T>Да, все необходимые действия я уже сделал. Более того, я выяснил, что не компилятся классы, которые объявлены с IMPLEMENT_DYNCREATE. Остальные (даже MFC — шные) компилятся без проблем, и что самое главное, правильно показывают, где происходят утечки памяти.
а какие ошибки получаешь? можешь прислать кусок кода, который не компилится?
Ошибка в строчке с IMPLEMENT_DYNCREATE
error C2661: 'CObject::operator new' : no overloaded function takes 4 parameters
По всей видимости, это из — за того, что в IMPLEMENT_DYNCREATE используется оператор new, который определён где — то раньше, и принимает другие параметры.
Вопрос в том, что с этим всем делать?
T>Ошибка в строчке с IMPLEMENT_DYNCREATE T>error C2661: 'CObject::operator new' : no overloaded function takes 4 parameters
T>По всей видимости, это из — за того, что в IMPLEMENT_DYNCREATE используется оператор new, который определён где — то раньше, и принимает другие параметры. T>Вопрос в том, что с этим всем делать?
из DllMain или (Win)Main или чего там вместо них в MFC?
по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах.
может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.
IL>из DllMain или (Win)Main или чего там вместо них в MFC? IL>по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах. IL>может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.
Ты будешь долго смеяться, но я вызываю эту функцию при старте приложения в CMyApp::CMyApp()
Определённый дамп я получаю в окно Output, но без информации о номере строки и имени файла. Проект большой, гадать не хочется
IL>>из DllMain или (Win)Main или чего там вместо них в MFC? IL>>по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах. IL>>может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.
T>Ты будешь долго смеяться, но я вызываю эту функцию при старте приложения в CMyApp::CMyApp() T>Определённый дамп я получаю в окно Output, но без информации о номере строки и имени файла. Проект большой, гадать не хочется
а чего гадать? номер неосвобожденного блока тебе в логе пишут.
поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:
условный breakpoint типа "lRequest = 777".
Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.
PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
IL>а чего гадать? номер неосвобожденного блока тебе в логе пишут. IL>поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:
IL>
IL>условный breakpoint типа "lRequest = 777". IL>Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.
IL>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
Спасибо, не знал про такой способ!
Сижу в дебагере, вернусь не скоро
Здравствуйте, IamLexa, Вы писали:
IL>а чего гадать? номер неосвобожденного блока тебе в логе пишут. IL>поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:
IL>
IL>условный breakpoint типа "lRequest = 777". IL>Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.
IL>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
Здравствуйте, mentor, Вы писали:
IL>>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
M>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...)
Так что открывай его, ставь бряк и пользуйся.
T>После чего есть предупреждение: T>Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.
T>Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?
Уважаемый, та статья была написана для проектов, которые не используют MFC. У MFC уже все это есть. Когда вы генерируете любой default MFC project, в код каждого CPP file (исключая stdafx.cpp file) CPP вставляется такая конструкция:
Здравствуйте, IamLexa, Вы писали:
M>>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
IL>Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...) IL>Так что открывай его, ставь бряк и пользуйся.
А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?
А>Уважаемый, та статья была написана для проектов, которые не используют MFC. У MFC уже все это есть. Когда вы генерируете любой default MFC project, в код каждого CPP file (исключая stdafx.cpp file) CPP вставляется такая конструкция: А>
Здравствуйте, mentor, Вы писали:
M>Здравствуйте, IamLexa, Вы писали:
M>>>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
IL>>Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...) IL>>Так что открывай его, ставь бряк и пользуйся.
M>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?
Хм.. странно. У меня вообще такого сообщения нет. Даже в релизной версии брекпоинт ставится нормально.
Здравствуйте, 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 на эту версию. Для этого включите в программу следующий фрагмент.
Здравствуйте, mentor, Вы писали:
M>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?
а ты можешь остановиться на каком-нить операторе new,
и пройти его по шагам в отладчике?
через несколько шагов я оказываюсь в dbgheap.c
Здравствуйте, IamLexa, Вы писали:
M>>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?
IL>а ты можешь остановиться на каком-нить операторе new, IL>и пройти его по шагам в отладчике? IL>через несколько шагов я оказываюсь в dbgheap.c
Пройтись по шагам могу, но до dbgheap.c он не доходит. Вообще не могу попасть ни в какие файлы за пределами своего проекта, будь то CRT или что то из MFC хотя все исходники есть. Может что то еще надо настроить в среде, не знаю, подскажите.
Здравствуйте, Trapper, Вы писали:
M>>Может я неправильно понял, но отладочная версия хочет 4 параметра, а define передает ему только 3. Обьясните, в чем я неправ?
T>Если я не ошибаюсь, ещё надо передать количество байт, которое надо выделить. Но это делается автоматически.
Здравствуйте, mentor, Вы писали:
M>Пройтись по шагам могу, но до dbgheap.c он не доходит. Вообще не могу попасть ни в какие файлы за пределами своего проекта, будь то CRT или что то из MFC хотя все исходники есть. Может что то еще надо настроить в среде, не знаю, подскажите.
так сразу не скажу.
1) какая версия VStudio?
2) какая runtime библиотека используется? (в св-вах проекта C/C++ / Code Generation / Runtime Library)
3) где лежат исходники? (каталог)
4) есть pdb-файл для runtime библиотеки? где он лежит?
Здравствуйте, 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 там лежат
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 там лежат
Здравствуйте, 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\
Здравствуйте, 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
Здравствуйте, 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 ни одного не стоит. Что, надо поставить шестой? Постараюсь найти...
mentor wrote: > > Здравствуйте, Pavel Dvorkin, Вы писали:
> А кстати, у меня походу наверное вообще SP ни одного не стоит. Что, надо поставить шестой? Постараюсь найти...
Здравствуйте, 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?
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 используется для создания экземпляров классов, вызывается соответственно конструктор и все.
Здравствуйте, mentor, Вы писали:
IL>>когда под отладчиком загружается твой проект -- в окошке Output должно быть написано что-то типа M>вот такая строчка есть IL>>Loaded 'C:\WINDOWS\system32\msvcrt.dll', No symbols loaded. M>и есть строчка для msvcrtd.dll
значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb.
оба этих файла лежат в System32 и даты у них совпадают?
кстати, идея поставить SP -- оч. правильная.
это должно помочь.
Здравствуйте, 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 мег качать с инета так сразу не очень охота.
Здравствуйте, mentor, Вы писали:
IL>>значица нужно смотреть на msvcrtd.dll и msvcrtd.pdb. IL>>оба этих файла лежат в System32 и даты у них совпадают?
M>Лежат оба. Но даты совсем не совпадают. dll 2003 год а pdb 1998 — го года
по всей видимости они у тебя разъехались. кто-то положил новую dll, а pdb к ней не обновил.
можешь попробовать найти на диске VStudio файлы msvcrtd.dll и msvcrtd.pdb и скопировать их в System32.
ну или может кто-нить тебе их пришлет.
PS.
а если это не критично -- можно в проекте использовать статическую runtime library.
Здравствуйте, 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.
Здравствуйте, 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-шке.
Здравствуйте, 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-шке.
Может конечно и не винда, какая нибудь другая прога свои прописала библиотеки. Во всяком случае мне замена помогла. Спасибо.