Debugging memory management errors VC++, pure C

Seryi
Ник закрыт как дубликат.
Posts: 6238
Joined: 14 Mar 2001 10:01
Location: .MD -> .SI -> .SE -> .AR.US -> .MD

Debugging memory management errors VC++, pure C

Post by Seryi »

Добрый день,

у меня есть проект, в нем время от времени появляются ошибки связанные с управлением памятью, например вызов free() для уже освобожденного блока. Проект очень большой и так просто локализовать ошибки не получается. Проект написан на чистом C и скомпилирован в VC++ 7.1.
Есть ли какие-то tools которые помогают в отлове ошибок memory management? Пробовал BoundsChecker, он мне ничем не помог :-(
Желательно чтобы для tools была доступна триал версия, потому что проект одноразовый и покупать tool нецелесообразно.

Заранее спасибо !!!
User avatar
Nervous
Уже с Приветом
Posts: 7759
Joined: 18 Sep 2001 09:01
Location: RUS.76 -> KOR -> RUS.53 -> US.PA -> US.MD

Post by Nervous »

Ну уж если BoundChecker не помог :pain1:
Какая версия кстати?
N.E.R.V.O.U.S.: Networked Electronic Replicant Viable for Observation and Ultimate Sabotage.
Seryi
Ник закрыт как дубликат.
Posts: 6238
Joined: 14 Mar 2001 10:01
Location: .MD -> .SI -> .SE -> .AR.US -> .MD

Post by Seryi »

Nervous wrote:Ну уж если BoundChecker не помог :pain1:
Какая версия кстати?


та что входит в Compuware DevPartner Studio 7.0
Может я его использую неправильно?
Я запускаю EXE-шник под ним и пытаюсь добиться падения программы. Добиваюсь, после этого BC генерирует мне огромный лист memory leaks, который мне не особо помогает. Естественно раз программа упала, а не была нормально завершена то там куча memory leaks.
Мне надо выяснить почему программа падает, конкретно почему иногда происходят двойные вызовы free()
User avatar
Nervous
Уже с Приветом
Posts: 7759
Joined: 18 Sep 2001 09:01
Location: RUS.76 -> KOR -> RUS.53 -> US.PA -> US.MD

Post by Nervous »

Да, думаю неправильно. Чтоб он начал что-то показывать, надо генерить код с его помощью - т.н. Instrumental Build. Для этого он интегрируется в VS - в меню студии появляется менюшка BoundsChecker. В ней надо включить Integrated Debugging и перестроить весь проект. Тогда в код будут "вкомпилировано" куча проверок. Там же его и запустить можно. Да, и поставьте Settings на Maximum, но будьте готовы, что боундсчекер будет ругаться на места, которые не выглядят ошибочными. Тогда просто давите кнопку Suppress или Acknowledge и идите дальше.
Да, вот тока я неуверен, что DevPartner 7.0 будет работать с .NET. У них на сайте есть 7.1, которая как раз для него. Доступна триал-версия.
N.E.R.V.O.U.S.: Networked Electronic Replicant Viable for Observation and Ultimate Sabotage.
Seryi
Ник закрыт как дубликат.
Posts: 6238
Joined: 14 Mar 2001 10:01
Location: .MD -> .SI -> .SE -> .AR.US -> .MD

Post by Seryi »

У меня такой менюшки нет, хотя говориться что .NET поддерживается. Сейчас попробую переустановить
User avatar
Boriskin
Уже с Приветом
Posts: 18906
Joined: 30 Aug 2001 09:01
Location: 3rd planet

Post by Boriskin »

Seryi wrote:Мне надо выяснить почему программа падает, конкретно почему иногда происходят двойные вызовы free()


Ну это то понятно, гдето указатели дублируются а потом чтото удаляется дважды, чтото подвисает. Скорее всего вам придется тупо смотреть код, и если проект действительно большой и запутанный - могу только посочувствовать, я не встречал пока хороших тулзов, помогающих от "кривых рук".

В качестве совета - вываливайте в диагностику значения указателей перед их освобождением и обнуляйте их после освобождения, так вы сможете локализовать что удаляется дважды.
Тупизна как Энтропия. Неумолимо растет.
Seryi
Ник закрыт как дубликат.
Posts: 6238
Joined: 14 Mar 2001 10:01
Location: .MD -> .SI -> .SE -> .AR.US -> .MD

Post by Seryi »

Boriskin wrote:Ну это то понятно, гдето указатели дублируются а потом чтото удаляется дважды, чтото подвисает. Скорее всего вам придется тупо смотреть код, и если проект действительно большой и запутанный - могу только посочувствовать, я не встречал пока хороших тулзов, помогающих от "кривых рук".

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



Ваш совет мне помог, впрочем как и BoundsChecker использованный как говорил Nervous. Вроде бы за 8 часов ожесточенного дебага я проблему решил.
Огромное спасибо. Если у меня будут еще C проекты обязательно куплю BoundsChecker.
Hatih
Уже с Приветом
Posts: 750
Joined: 10 Dec 2003 20:11

Post by Hatih »

Sam Adams
Уже с Приветом
Posts: 1316
Joined: 03 Jul 2003 06:02
Location: USA

Post by Sam Adams »

Nervous wrote:Да, вот тока я неуверен, что DevPartner 7.0 будет работать с .NET. У них на сайте есть 7.1, которая как раз для него. Доступна триал-версия.


У них вышла уже следующая версия, вчера мы её получили, правда, пока что не поставил.

Memory leaks в последнее время не ловлю (т.к. большей частью стал писать на C#), а профайлер и Memory Analyzer хороши!

Return to “Вопросы и новости IT”