Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 520651

Как найти ошибки в программе, которые портят память? Что такое Assertion Error в SafeMM и как искать ошибку? - Delphi

$
0
0
Добрый день!



У меня есть приложение на 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 (имею ввиду, как найти эти ошибки, а не отключить отображение ошибки)?

Viewing all articles
Browse latest Browse all 520651

Latest Images

Trending Articles

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>