Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1440002554
Той
2015-08-19 19:42
2017.04.16
Как узнать все методы имеющиеся в объекте OleVariant ?


2-1438940029
vadim83
2015-08-07 12:33
2017.04.16
Строка, лучший способ сравнения


2-1440917515
K-1000
2015-08-30 09:51
2017.04.16
BOOL -> Boolean


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


2-1440148888
lewka
2015-08-21 12:21
2017.04.16
BorderStyle для MDIForm





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский