Як я можу знайти витік пам'яті запущеного процесу?


19

Чи є спосіб, я можу знайти витік пам'яті запущеного процесу? Я можу використовувати Valgrind для пошуку витоків пам'яті до початку процесу. Я можу використовувати GDB, щоб приєднати його до запущеного процесу. Як я можу налагодити витік пам'яті у запущеному процесі?


Valgrind дуже корисний, я б навіть назвав це інтуїтивно зрозумілим.
user400344

Відповіді:


13

Ось майже гарантійні кроки для пошуку того, хто просочує пам'ять:

  1. Дізнайтеся PID процесу, який спричиняє витік пам'яті.

    ps -aux
  2. захопити /proc/PID/smapsта зберегти у якийсь файл, як-от BeforeMemInc.txt.

  3. чекайте, поки пам’ять збільшиться.
  4. знову захопити /proc/PID/smapsі зберегти йогоafterMemInc.txt
  5. знайти різницю між першим smapsі другим smaps, наприклад, з

    diff -u beforeMemInc.txt afterMemInc.txt

  6. запишіть діапазон адрес, у якому збільшилася пам’ять, наприклад:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
  7. використовувати GDB, щоб скинути пам'ять під час запущеного процесу або отримати coredump gcore -o process

  8. Я використовував gdb під час запуску, щоб скинути пам'ять на якийсь файл.

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
  9. Тепер скористайтеся stringsкомандою або hexdump -Cдля друкуdump_outputfile.dump

    strings outputfile.dump
  10. Ви отримуєте читабельну форму, де ви зможете знайти ці рядки у вихідному коді.

  11. Проаналізуйте джерело, щоб знайти витік.


12

Я думаю, що мемалекс - це саме те, що ти хочеш.

Він налагоджує витік пам'яті запущеного процесу, приєднуючи його, без перекомпіляції програми або перезавантаження цільового процесу. Це дуже зручно і підходить для виробничих умов.

Він працює на GNU / Linux та FreeBSD.

ПРИМІТКА: Я автор, будь-яка пропозиція вітається

== EDIT ==

Я записую інший інструмент libleak , який підключає функції пам'яті LD_PRELOAD.

Також не потрібно змінювати цільову програму. Хоча вам потрібно перезапустити хід за допомогою LD_PRELOAD, ви можете ввімкнути / відключити виявлення під час запуску.

На продуктивність значно менший вплив, оскільки немає сигнальної пастки.

У порівнянні з аналогічними інструментами (такими як mtrace), він друкує повний стек викликів при підозрілій точці витоку пам'яті.


1
Я поручую на memleax як дуже корисний інструмент для моніторингу будь-яких очевидних витоків. У вихідні резюме дивно ефективні . Майже як би я написав їх, якби в мене була потужність обробки, щоб це зробити вручну. Дякую за це
вересень

6

У Linux ви можете включити mtrace у своїй програмі, але це зміна коду.

На OpenBSD ви можете спробувати статистику молока .

Google перевірка витоку може також заслуговувати уваги, і на відміну від mtrace, ви можете користуватися, LD_PRELOADщоб уникнути перекомпіляції.


0

Я думаю, не надаючи підтримки для моніторингу розподілу після запуску програми безпосередньо у вихідному коді, вам не пощастило. Ось дві причини, про які я можу придумати:

  • Купі шашки ініціалізуються, коли програма починається. Деякі пропонують можливість налаштувати точні строки, але змінні середовища, які їх запускають, повинні бути встановлені під час роботи програми. Це тому, що вони стежать за тим, щоб переконатися, що кожен розподіл має відповідне місце розташування, і в іншому випадку вони пропустять.
  • Перевірка купи зазвичай вимагає підвищених привілеїв або гачків, які повинні бути надані операційною системою. Якщо під час запуску програми ці гачки не передбачені, купі шашки не можуть використовувати їх. Я не вірю, що ОС запускає ці пільги після запуску відповідної програми.

Якщо, однак, програма запущена у віртуальній машині, це середовище може підтримувати моніторинг асигнувань. Я знаю, що у Java є кілька інструментів моніторингу розподілу та збору сміття (як-от visualVM ), які додаються до запущених програм або віртуальних машин.


0

Purify IBM - це, мабуть, найстаріший і найскладніший інструмент з усіх. Він позначить номер рядка в коді, який спричиняє витік пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.