Форум: "Прочее";
Текущий архив: 2017.04.16;
Скачать: [xml.tar.bz2];
ВнизОбнаружение утечек в функции. Найти похожие ветки
← →
DayGaykin © (2016-04-08 10:08) [0]Есть простой веб-сервис. Внутри веб-сервиса несколько потоков, которые обрабатывают запросы. При запросе внутри вызывается функция, которая его обрабатывает.
Т.к. программисты тоже люди, то в функциях могут быть утечки памяти. Хотелось бы ловить их автоматически и на боевом сервере в том числе. Вопрос: как их ловить?
Язык: FreePascal или C++ (предпочтительнее). OS: Linux.
← →
Rouse_ © (2016-04-08 10:18) [1]Ну как обычно, перехватываешь mmap(), munmap() (вместо VirtualAlloc/VirtualFree) и считаешь - кто что отожрал и не освободил.
← →
Rouse_ © (2016-04-08 10:21) [2]Хотя умные люди говорят что это можно на уровне PTE management сделать - но я не силен во всех этих линуксовых штучках, поэтому тут сам инфу поищи
← →
DayGaykin © (2016-04-08 10:30) [3]
> Rouse_ ©
Саш, может я что-то не так понимаю.
Разве такая функция вызовет VirtualAlloc/mmap?
begin
TObject.Create;
end;
Я думал, у delphi (fp) своя куча.
← →
Rouse_ © (2016-04-08 10:35) [4]
> DayGaykin © (08.04.16 10:30) [3]
>
> > Rouse_ ©
>
> Саш, может я что-то не так понимаю.
> Разве такая функция вызовет VirtualAlloc/mmap?
>
> begin
> TObject.Create;
> end;
>
> Я думал, у delphi (fp) своя куча.
Ну началось.
Во первых это не куча - куча работает на выделенных страницах, во вторых чтобы их выделить - кто-то должен сказать VirtualAlloc/mmap.
Посмотри как устроен менеджер памяти - он же в исходных кодах идет.
← →
DayGaykin © (2016-04-08 10:57) [5]
> Rouse_ © (08.04.16 10:35) [4]
Так получится, что скорее всего VirtualAlloc был вызван уже ранее. И не для моего объекта, а для менеджера памяти. И на выходе из функции последний вряд ли вызовет VirtualFree. Поэтому следить за ними бессмысленно в рамках моей задачи - я не узнаю все ли вернула функция, что взяла. Поправь, пожалуйста.
В делфи (и в FP), как я понял из изученного, можно создать обертку менеджеру памяти и считать по-поточно сколько выделено, сколько возвращено (+ не использовать явно дескрипторы).
С с++ в линуксе пока разбираюсь.
P.S. Общая задача у меня как раз научиться. Обучение боем.
← →
Rouse_ © (2016-04-08 11:08) [6]Да, естественно бал вызван заранее.
Дельфевый манагер контролирует 2 вещи (если убрать динамику) - выделение памяти и что в этой памяти находится.
посмотри getmem.inc
а также для общего развития вот это: https://rsdn.ru/article/Delphi/memmanager.xml
← →
DVM © (2016-04-08 15:22) [7]
> DayGaykin © (08.04.16 10:08)
Не проще перезапускать веб-сервис регулярно?
← →
DayGaykin © (2016-04-08 15:54) [8]
> Не проще перезапускать веб-сервис регулярно?
Вообще просто. Но ошибочки выискивать тоже хочется.
← →
NoUser © (2016-04-08 17:05) [9]> внутри вызывается функция,
это ж "OS: Linux" - бери код и выискивай,
в чём вопрс то, если хочется.
← →
Eraser © (2016-04-08 17:22) [10]
>
> DayGaykin © (08.04.16 10:08)
> Есть простой веб-сервис.
может оказаться, что проще переписать все под какой-нибудь апач, если функционал простой, чем искать странную ошибку в самопальном сервера.
← →
DayGaykin © (2016-04-08 17:59) [11]
> проще переписать все под какой-нибудь апач, если функционал
> простой, чем искать странную ошибку в самопальном сервера.
Сам сервер не причем. Его можно один раз написать и хорошо отладить, можно взять тот же апач, nginx и т. п.
Утечки нужно искать в функциях, которые обрабатывают логику.
← →
Rouse_ © (2016-04-08 18:38) [12]Задача то какая?
Написать продукт или найти в нем косяк?
← →
DayGaykin © (2016-04-08 18:50) [13]
> Rouse_ © (08.04.16 18:38) [12]
> Задача то какая?
> Написать продукт или найти в нем косяк?
Совершенная форма "написать" не очень уместна. Дописываться будет постоянно.
Задача - продукт без косяков. Хотя бы без таких, которые могут привести к остановке сервиса.
← →
Rouse_ © (2016-04-08 18:55) [14]Ну в принципе, зная тебя по работе у нас, вот это: "продукт без косяков. Хотя бы без таких, которые могут привести к остановке сервиса."
ты сможешь реализовать
← →
Pavia © (2016-04-08 19:35) [15]Лучше всего применять статический анализ.
Динамический анализ требует написания фазинг-теста который позволит протестировать все ветки или почти все ветки кода. И другие недостатки имеются.
Для поиска утечек памяти применяют:
в Си : valgrind.
http://valgrind.org/docs/manual/valgrind_manual.pdf
В Delphi FastMM в Debug режиме.
AQTime также может искать ошибки утечек.
А так существует ряд методик для ловли и избегания ошибок.
К примеру использовать шаблоны проектирования. Выделение и освобождение выносится из функций и сосредотачивается в единичных местах. К примеру:
- использование коллекций;
- абстрактная фабрика;
- шаблон строитель.
А по поводу ловли тестирование данных по входам и выходам. Интерфейсное тестирование. И тестирование по форматам данных.
← →
Pavia © (2016-04-08 19:36) [16]
> Ну в принципе, зная тебя по работе у нас, вот это: "продукт
> без косяков. Хотя бы без таких, которые могут привести к
> остановке сервиса." ты сможешь реализовать
А если сроки все вышли или вернее очень сильно ограничены. И дописывание не предвидится?
← →
Rouse_ © (2016-04-08 20:10) [17]Ты ветку вообще читаешь? У него линукс :)
← →
Pavia © (2016-04-08 20:19) [18]
> Ты ветку вообще читаешь? У него линукс :)
Читаю. Представь у меня тоже Линукс и Си++. Вот сижу думаю как уложиться в сроки. С учётом праздников и командировок.
← →
Rouse_ © (2016-04-08 20:22) [19]
> Pavia © (08.04.16 19:35) [15]
И еще немного на будущее - в тестировании мемликов фазинг не применяется - ибо слишком высока энтропия на выхлопе.
← →
Rouse_ © (2016-04-08 20:23) [20]Давай может в скайп перейдем? :)
← →
Rouse_ © (2016-04-08 20:28) [21]стучись, я в скайпе: "mr_rouse"
(если таких много то я "Пушистое Пельмешко" :)
так получилось :)
← →
DayGaykin © (2016-04-08 22:12) [22]:)))
> Ну в принципе, зная тебя по работе у нас, вот это: "продукт
> без косяков. Хотя бы без таких, которые могут привести к
> остановке сервиса."
> ты сможешь реализовать
Спасибо за оценку!
← →
Cobalt © (2016-04-14 14:47) [23]А FastMM под линукс (во FreePascal) работает?
← →
Rouse_ © (2016-04-14 21:40) [24]А должен?
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2017.04.16;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.002 c