SQLRU.net
Разработка приложений баз данных

Начало » Программирование » Delphi » Как найти ошибки в программе, которые портят память? Что такое Assertion Error в SafeMM и как искать
Как найти ошибки в программе, которые портят память? Что такое Assertion Error в SafeMM и как искать [сообщение #6022] Mon, 21 April 2025 14:27 Переход к следующему сообщению
Svetlana95 в настоящее время не в онлайне  Svetlana95
Сообщений: 2
Зарегистрирован: April 2025
Junior Member
Добрый день!



У меня есть приложение на Delphi 7 - примерно 800 тысяч строк, приложение регулярно дорабатывается.

Использую FastMM для работы с памятью. В целом работает нормально - но иногда возникают странные глюки у клиентов и невозможно понять, в чём дело.

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

Что было сделано для решения проблемы:

1) Убраны все Hints и Warnings при компиляции приложения (было около 2000 штук). Исправлено несколько ошибок.

2) Включены опции Range Check и Overflow Check - причём не только у меня - но и в версии, распространяемой клиентам. Сразу в первые недели удалось найти около 10 ошибок и исправить.

3) Освобождение памяти Free заменено везде в программе на FreeAndNil (да, читала статьи GunSmoker про это). Тоже позволило исправить несколько ошибок.

4) Может, немного некрасивое и временное решение проблемы - но поправила FastMM4, чтобы при запросе на выделение памяти он выделял в 1,5 раза больше, чем нужно +150 байт сверху. В принципе, памяти у большинства клиентов хватает, а кому не хватает - сделана возможность вручную регулировать выделение памяти по формуле size = m * size0 + a (где m - мультипликатор, a - доп. байты). Например, если m = 1.0, a = 0 - тогда лишняя память не выделяется. Если m = 1.5, а = 200 - то на каждый блок памяти выделяется в 1,5 раза больше, чем нужно + 200 байт.

Остроту проблемы это временно сняло. Но однако, проблемы и глюки всё равно остались, хоть и стало их в 5 раз меньше. Хочется найти ошибки и их исправить. Полагаю, ошибки могут быть не только в моём коде, но и в VCL и в Indy - в частности, EurekaLog ругается на работу IdHttp в потоке - а он мне нужен, чтобы читать содержимое нужной веб-страницы с Интернета.

EurekaLog + FastMM (Full Debug Mode) при часовом прогоне на моём компьютере ошибок не находят (кроме ошибок IdHttp в потоке - но это не моя вина, наверное).


Если же запустить программу под SafeMM менеджером памяти - появляется куча ошибок Assertion Error, которые укаазывают на строку 437 в SafeMM - но непонятно, как это поможет найти ошибку. Если убрать IdHttp - всё равно ошибки AssertionError остаются. Вопрос такой - что делать с Assertion Error, где искать ошибки, чтобы их не было? Ведь не показывается адрес памяти, где ошибка, просто какой-то непонятный Assertion Error.

Что делать с ошибками в программе, как их найти - и как добиться того, чтобы программа запускалась с менеджером памяти SafeMM без AssertionError (имею ввиду, как найти эти ошибки, а не отключить отображение ошибки)?





Re: Как найти ошибки в программе, которые портят память? Что такое Assertion Error в SafeMM и как искать [сообщение #6023 является ответом на сообщение #6022] Tue, 22 April 2025 00:24 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 374
Зарегистрирован: June 2022
Senior Member
Насколько я помню, у SafeMM AssertionError имеет детализацию ошибки.
Какие ошибки у вас сыпятся? Access Violation?
Re: Как найти ошибки в программе, которые портят память? Что такое Assertion Error в SafeMM и как искать [сообщение #6024 является ответом на сообщение #6023] Tue, 22 April 2025 02:00 Переход к предыдущему сообщениюПереход к следующему сообщению
Svetlana95 в настоящее время не в онлайне  Svetlana95
Сообщений: 2
Зарегистрирован: April 2025
Junior Member
Assertion failure (SafeMM.pas, line 437)

без детализации
Re: Как найти ошибки в программе, которые портят память? Что такое Assertion Error в SafeMM и как искать [сообщение #6025 является ответом на сообщение #6024] Tue, 22 April 2025 22:39 Переход к предыдущему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 374
Зарегистрирован: June 2022
Senior Member
Тогда добивайтесь вылета под отладчиком и смотрите call stack. Или попробуйте залогировать стек при ошибке, ходя под D7 это проблематично, конечно.
Предыдущая тема: Delphi жив?
Переход к форуму:
  


Текущее время: Wed Apr 23 07:18:49 GMT+3 2025

Общее время, затраченное на создание страницы: 0.00664 секунд