Есть ли способ найти утечку памяти с помощью файла ядра? - PullRequest
9 голосов
/ 16 сентября 2011

У меня дамп ядра из приложения с утечкой памяти. Я использовал команду strings и xdd для проверки файла, и у меня есть несколько идей о том, какая часть программы может быть ответственна за утечку. Я могу запустить файл ядра в gdb вместе с приложением, но я не могу провести с ним много испытаний, потому что это встроенное приложение со множеством сложных операций ввода-вывода, основанных на времени, которые я не могу смоделировать в офисе .

Я также слышал, что работа с различными утилитами обнаружения утечек памяти замедлит работу приложения, которое мы не можем себе позволить, поскольку оно уже работает почти на уровне загрузки процессора.

Итак, пока все, что у меня есть, это файл ядра. Пример того, что я ищу: есть ли таблица указателей, которую я могу проверить, чтобы найти выделенную память, которую я затем могу использовать, чтобы попытаться найти вещи, которые должны были быть освобождены, но не были?

Ответы [ 3 ]

10 голосов
/ 16 сентября 2011

Не очень легко, нет.Весь смысл утечки памяти заключается в том, что выделенная память больше не имеет ссылки на нее.

Вам придется пройтись по всей области памяти, чтобы получить список всех выделенных блоков, а затем изучить каждыйвозможная переменная / ячейка памяти, которая может указывать на нее (почти наверняка с некоторыми ложными срабатываниями).

Возможно, стоит попытаться получить некоторую статистику по выделенным блокам.Предполагая, что утечка памяти вызывает проблему нехватки памяти, большинство блоков будет иметь определенный тип, основанный на возможном размере или содержимом.

Например, если80% выделенных блоков имеют длину 31424 байта, вы будете искать выделения этого диапазона (давать или брать 16 байтов, в зависимости от того, как работает распределитель памяти).

Или, если все они содержат строкикак "2011-01-01 15:25:00 Начиная процесс 42", вы можете искать утечку в библиотеке журналов.

В любом случае вам придется погрузиться в источник времени выполнения C ++код, чтобы узнать, как найти арену памяти, а затем использовать этот код, чтобы иметь возможность пересечь структуры.

2 голосов
/ 09 января 2015

Утечка памяти может быть оценена с помощью дампа ядра, как указано в paxdiablo. Также, если какой-то шаблон повторяется в corefile, он может быть оценен, как указано ниже: 1. Я взял пример c ++:

class Base  
{  
    public:  
    virtual void fun(){}  
    virtual void xyz(){}  
    virtual void lmv(){}  
    virtual void abc(){}  
};  

class Derived: public Base  
{  
    public:  
    void fun(){}  
    void xyz(){}  
    void lmv(){}  
     void abc(){}  
};  

void fun()  
{  
    Base *obj  = new Derived();  
}  
int main()  
{  
    for(int i=0; i<2500;i++)  
    fun();  
    sleep(3600);  
    return 0; 
}
  1. Создание ядра с помощью команды gcore

  2. Поиск повторяющегося шаблона из основного файла. ayadav @ ajay-PC: ~ $ hexdump core.10639 | awk '{printf "% s% s% s% s \ n% s% s% s% s \ n", $ 5, $ 4, $ 3, $ 2, $ 9, $ 8, $ 7, $ 6}' | сортировать | uniq -c | сортировать -nr | головка 6685 0000000000000000
    2502 0000002100000000
    2500 004008d000000000
    726 0000000000007eff
    502
    125 2e4314d000007eff
    93 006010d000000000
    81 0000000100007eff
    80 0000000100000000
    73 0000000000000001

0000002100000000 и 004008d000000000 - повторяющийся шаблон

  1. Проверьте каждое слово, что с? (GDB) информационный символ ... (гдб) х ...

    пример
    (gdb) информационный символ 0x4008d000
    Символ не соответствует 0x4008d000.
    (gdb) информационный символ 0x4008d0
    vtable для Derived + 16 в разделе .rodata из / home / ayadav / virtual

  2. Вероятно, наиболее частый vtable должен относиться к утечке памяти, т.е. производный vtable.

Примечание: я согласен, что анализ coredump не является наилучшей практикой для обнаружения утечки памяти. Утечку памяти можно обнаружить с помощью различных статических и динамических инструментов, таких как valgrind и т. Д.

0 голосов
/ 16 сентября 2011

Как сказал paxdiablo, вряд ли возможно выяснить, что просочилось, просто посмотрев на структуры данных кучи (malloc) после смерти.

Один довольно легкий способ выяснить, какой тип объектов протекает, - это иметь счетчик экземпляров для каждого класса, который может протекать. Таким образом, вы можете просто изучить счетчики экземпляров в основном файле.

...