-
Есть простой веб-сервис. Внутри веб-сервиса несколько потоков, которые обрабатывают запросы. При запросе внутри вызывается функция, которая его обрабатывает.
Т.к. программисты тоже люди, то в функциях могут быть утечки памяти. Хотелось бы ловить их автоматически и на боевом сервере в том числе. Вопрос: как их ловить?
Язык: FreePascal или C++ (предпочтительнее). OS: Linux.
-
Ну как обычно, перехватываешь mmap(), munmap() (вместо VirtualAlloc/VirtualFree) и считаешь - кто что отожрал и не освободил.
-
Хотя умные люди говорят что это можно на уровне PTE management сделать - но я не силен во всех этих линуксовых штучках, поэтому тут сам инфу поищи
-
> Rouse_ ©
Саш, может я что-то не так понимаю.
Разве такая функция вызовет VirtualAlloc/mmap?
begin
TObject.Create;
end;
Я думал, у delphi (fp) своя куча.
-
> DayGaykin © (08.04.16 10:30) [3]
>
> > Rouse_ ©
>
> Саш, может я что-то не так понимаю.
> Разве такая функция вызовет VirtualAlloc/mmap?
>
> begin
> TObject.Create;
> end;
>
> Я думал, у delphi (fp) своя куча.
Ну началось.
Во первых это не куча - куча работает на выделенных страницах, во вторых чтобы их выделить - кто-то должен сказать VirtualAlloc/mmap.
Посмотри как устроен менеджер памяти - он же в исходных кодах идет.
-
> Rouse_ © (08.04.16 10:35) [4]
Так получится, что скорее всего VirtualAlloc был вызван уже ранее. И не для моего объекта, а для менеджера памяти. И на выходе из функции последний вряд ли вызовет VirtualFree. Поэтому следить за ними бессмысленно в рамках моей задачи - я не узнаю все ли вернула функция, что взяла. Поправь, пожалуйста.
В делфи (и в FP), как я понял из изученного, можно создать обертку менеджеру памяти и считать по-поточно сколько выделено, сколько возвращено (+ не использовать явно дескрипторы).
С с++ в линуксе пока разбираюсь.
P.S. Общая задача у меня как раз научиться. Обучение боем.
-
Да, естественно бал вызван заранее.
Дельфевый манагер контролирует 2 вещи (если убрать динамику) - выделение памяти и что в этой памяти находится.
посмотри getmem.inc
а также для общего развития вот это:
https://rsdn.ru/article/Delphi/memmanager.xml
-
> DayGaykin © (08.04.16 10:08)
Не проще перезапускать веб-сервис регулярно?
-
> Не проще перезапускать веб-сервис регулярно?
Вообще просто. Но ошибочки выискивать тоже хочется.
-
> внутри вызывается функция,
это ж "OS: Linux" - бери код и выискивай,
в чём вопрс то, если хочется.
-
>
> DayGaykin © (08.04.16 10:08)
> Есть простой веб-сервис.
может оказаться, что проще переписать все под какой-нибудь апач, если функционал простой, чем искать странную ошибку в самопальном сервера.
-
> проще переписать все под какой-нибудь апач, если функционал
> простой, чем искать странную ошибку в самопальном сервера.
Сам сервер не причем. Его можно один раз написать и хорошо отладить, можно взять тот же апач, nginx и т. п.
Утечки нужно искать в функциях, которые обрабатывают логику.
-
Задача то какая?
Написать продукт или найти в нем косяк?
-
> Rouse_ © (08.04.16 18:38) [12]
> Задача то какая?
> Написать продукт или найти в нем косяк?
Совершенная форма "написать" не очень уместна. Дописываться будет постоянно.
Задача - продукт без косяков. Хотя бы без таких, которые могут привести к остановке сервиса.
-
Ну в принципе, зная тебя по работе у нас, вот это: "продукт без косяков. Хотя бы без таких, которые могут привести к остановке сервиса."
ты сможешь реализовать
-
Лучше всего применять статический анализ.
Динамический анализ требует написания фазинг-теста который позволит протестировать все ветки или почти все ветки кода. И другие недостатки имеются.
Для поиска утечек памяти применяют:
в Си : valgrind.
http://valgrind.org/docs/manual/valgrind_manual.pdfВ Delphi FastMM в Debug режиме.
AQTime также может искать ошибки утечек.
А так существует ряд методик для ловли и избегания ошибок.
К примеру использовать шаблоны проектирования. Выделение и освобождение выносится из функций и сосредотачивается в единичных местах. К примеру:
- использование коллекций;
- абстрактная фабрика;
- шаблон строитель.
А по поводу ловли тестирование данных по входам и выходам. Интерфейсное тестирование. И тестирование по форматам данных.
-
> Ну в принципе, зная тебя по работе у нас, вот это: "продукт
> без косяков. Хотя бы без таких, которые могут привести к
> остановке сервиса." ты сможешь реализовать
А если сроки все вышли или вернее очень сильно ограничены. И дописывание не предвидится?
-
Ты ветку вообще читаешь? У него линукс :)
-
> Ты ветку вообще читаешь? У него линукс :)
Читаю. Представь у меня тоже Линукс и Си++. Вот сижу думаю как уложиться в сроки. С учётом праздников и командировок.
-
> Pavia © (08.04.16 19:35) [15]
И еще немного на будущее - в тестировании мемликов фазинг не применяется - ибо слишком высока энтропия на выхлопе.
-
Давай может в скайп перейдем? :)
-
стучись, я в скайпе: "mr_rouse"
(если таких много то я "Пушистое Пельмешко" :)
так получилось :)
-
:)))
> Ну в принципе, зная тебя по работе у нас, вот это: "продукт
> без косяков. Хотя бы без таких, которые могут привести к
> остановке сервиса."
> ты сможешь реализовать
Спасибо за оценку!
-
А FastMM под линукс (во FreePascal) работает?
-
А должен?