Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.04.16;
Скачать: CL | DM;

Вниз

Обнаружение утечек в функции.   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.005 c
2-1439826143
igel888
2015-08-17 18:42
2017.04.16
Вопрос по Locate


2-1440325683
castor
2015-08-23 13:28
2017.04.16
элементы документации


2-1440002554
Той
2015-08-19 19:42
2017.04.16
Как узнать все методы имеющиеся в объекте OleVariant ?


2-1439881198
shunya
2015-08-18 09:59
2017.04.16
Ошибка в Twebbrowser


2-1440748056
АИК
2015-08-28 10:47
2017.04.16
Отправка документа на отдельный принтер