Конференция "Прочее" » Обнаружение утечек в функции.
 
  • DayGaykin © (08.04.16 10:08) [0]
    Есть простой веб-сервис. Внутри веб-сервиса несколько потоков, которые обрабатывают запросы. При запросе внутри вызывается функция, которая его обрабатывает.

    Т.к. программисты тоже люди, то в функциях могут быть утечки памяти. Хотелось бы ловить их автоматически и на боевом сервере в том числе. Вопрос: как их ловить?

    Язык: FreePascal или C++ (предпочтительнее). OS: Linux.
  • Rouse_ © (08.04.16 10:18) [1]
    Ну как обычно, перехватываешь mmap(), munmap() (вместо VirtualAlloc/VirtualFree) и считаешь - кто что отожрал и не освободил.
  • Rouse_ © (08.04.16 10:21) [2]
    Хотя умные люди говорят что это можно на уровне PTE management сделать - но я не силен во всех этих линуксовых штучках, поэтому тут сам инфу поищи
  • DayGaykin © (08.04.16 10:30) [3]

    > Rouse_ ©

    Саш, может я что-то не так понимаю.
    Разве такая функция вызовет VirtualAlloc/mmap?

    begin
    TObject.Create;
    end;


    Я думал, у delphi (fp) своя куча.
  • Rouse_ © (08.04.16 10:35) [4]

    > DayGaykin ©   (08.04.16 10:30) [3]
    >
    > > Rouse_ ©
    >
    > Саш, может я что-то не так понимаю.
    > Разве такая функция вызовет VirtualAlloc/mmap?
    >
    > begin
    > TObject.Create;
    > end;
    >
    > Я думал, у delphi (fp) своя куча.

    Ну началось.
    Во первых это не куча - куча работает на выделенных страницах, во вторых чтобы их выделить - кто-то должен сказать VirtualAlloc/mmap.
    Посмотри как устроен менеджер памяти - он же в исходных кодах идет.
  • DayGaykin © (08.04.16 10:57) [5]

    > Rouse_ ©   (08.04.16 10:35) [4]

    Так получится, что скорее всего VirtualAlloc был вызван уже ранее. И не для моего объекта, а для менеджера памяти. И на выходе из функции последний вряд ли вызовет VirtualFree. Поэтому следить за ними бессмысленно в рамках моей задачи - я не узнаю все ли вернула функция, что взяла. Поправь, пожалуйста.

    В делфи (и в FP), как я понял из изученного, можно создать обертку менеджеру памяти и считать по-поточно сколько выделено, сколько возвращено (+ не использовать явно дескрипторы).

    С с++ в линуксе пока разбираюсь.

    P.S. Общая задача у меня как раз научиться. Обучение боем.
  • Rouse_ © (08.04.16 11:08) [6]
    Да, естественно бал вызван заранее.
    Дельфевый манагер контролирует 2 вещи (если убрать динамику) - выделение памяти и что в этой памяти находится.
    посмотри getmem.inc

    а также для общего развития вот это: https://rsdn.ru/article/Delphi/memmanager.xml
  • DVM © (08.04.16 15:22) [7]

    > DayGaykin ©   (08.04.16 10:08) 

    Не проще перезапускать веб-сервис регулярно?
  • DayGaykin © (08.04.16 15:54) [8]

    > Не проще перезапускать веб-сервис регулярно?

    Вообще просто. Но ошибочки выискивать тоже хочется.
  • NoUser © (08.04.16 17:05) [9]
    >  внутри вызывается функция,
    это ж "OS: Linux" - бери код и выискивай,
    в чём вопрс то, если хочется.
  • Eraser © (08.04.16 17:22) [10]

    >
    > DayGaykin ©   (08.04.16 10:08) 
    > Есть простой веб-сервис.

    может оказаться, что проще переписать все под какой-нибудь апач, если функционал простой, чем искать странную ошибку в самопальном сервера.
  • DayGaykin © (08.04.16 17:59) [11]

    > проще переписать все под какой-нибудь апач, если функционал
    > простой, чем искать странную ошибку в самопальном сервера.

    Сам сервер не причем. Его можно один раз написать и хорошо отладить, можно взять тот же апач, nginx и т. п.
    Утечки нужно искать в функциях, которые обрабатывают логику.
  • Rouse_ © (08.04.16 18:38) [12]
    Задача то какая?
    Написать продукт или найти в нем косяк?
  • DayGaykin © (08.04.16 18:50) [13]

    > Rouse_ ©   (08.04.16 18:38) [12]
    > Задача то какая?
    > Написать продукт или найти в нем косяк?

    Совершенная форма "написать" не очень уместна. Дописываться будет постоянно.
    Задача - продукт без косяков. Хотя бы без таких, которые могут привести к остановке сервиса.
  • Rouse_ © (08.04.16 18:55) [14]
    Ну в принципе, зная тебя по работе у нас, вот это: "продукт без косяков. Хотя бы без таких, которые могут привести к остановке сервиса."
    ты сможешь реализовать
  • Pavia © (08.04.16 19:35) [15]
    Лучше всего применять статический анализ.
    Динамический анализ требует написания фазинг-теста который позволит протестировать все ветки или почти все ветки кода. И другие недостатки имеются.

    Для поиска утечек памяти применяют:
    в Си : valgrind.
    http://valgrind.org/docs/manual/valgrind_manual.pdf
    В Delphi FastMM в Debug режиме.
    AQTime также может искать ошибки утечек.

    А так существует ряд методик для ловли и избегания ошибок.
    К примеру использовать шаблоны проектирования. Выделение и освобождение выносится из функций и сосредотачивается в единичных местах. К примеру:
    - использование коллекций;
    - абстрактная фабрика;
    - шаблон строитель.

    А по поводу ловли тестирование данных по входам и выходам. Интерфейсное тестирование. И тестирование по форматам данных.
  • Pavia © (08.04.16 19:36) [16]

    > Ну в принципе, зная тебя по работе у нас, вот это: "продукт
    > без косяков. Хотя бы без таких, которые могут привести к
    > остановке сервиса." ты сможешь реализовать

    А если сроки все вышли или вернее очень сильно ограничены. И дописывание не предвидится?
  • Rouse_ © (08.04.16 20:10) [17]
    Ты ветку вообще читаешь? У него линукс :)
  • Pavia © (08.04.16 20:19) [18]

    > Ты ветку вообще читаешь? У него линукс :)

    Читаю. Представь у меня тоже Линукс и Си++. Вот сижу думаю как уложиться в сроки. С учётом праздников и командировок.
  • Rouse_ © (08.04.16 20:22) [19]

    > Pavia ©   (08.04.16 19:35) [15]

    И еще немного на будущее - в тестировании мемликов фазинг не применяется - ибо слишком высока энтропия на выхлопе.
  • Rouse_ © (08.04.16 20:23) [20]
    Давай может в скайп перейдем? :)
  • Rouse_ © (08.04.16 20:28) [21]
    стучись, я в скайпе: "mr_rouse"    
    (если таких много то я "Пушистое Пельмешко" :)
    так получилось :)
  • DayGaykin © (08.04.16 22:12) [22]
    :)))


    > Ну в принципе, зная тебя по работе у нас, вот это: "продукт
    > без косяков. Хотя бы без таких, которые могут привести к
    > остановке сервиса."
    > ты сможешь реализовать

    Спасибо за оценку!
  • Cobalt © (14.04.16 14:47) [23]
    А FastMM под линукс (во FreePascal) работает?
  • Rouse_ © (14.04.16 21:40) [24]
    А должен?
 
Конференция "Прочее" » Обнаружение утечек в функции.
Есть новые Нет новых   [134434   +30][b:0.001][p:0.001]