как определить, нет ли в модуле ядра Linux утечки памяти - PullRequest
9 голосов
/ 06 мая 2011

Для проверки поведения ядра при утечке памяти я пишу модуль ядра, который постоянно выделяет память, например, код выглядит как

int bytesLeaked = 128000;
char *var = kmalloc(bytesLeaked, GFP_KERNEL); 
if (var != NULL)
printk("leaked %d bytes at address %x\n", bytesLeaked, (unsigned int)var);

Этот код находится в init_module. У меня есть следующие вопросы

  1. Как определить, утек ли код из памяти? lsmod не показывает много.
  2. В учебных руководствах в Интернете код отображается только в init_module и exit_module. Что делать, если я хочу сделать выделение памяти в течение определенного периода времени после того, как модуль был вставлен, но перед выходом.
  3. Могу ли я написать код, который приводит к утечке памяти, только когда пользователь дает ему указание сделать это, например, может ли программа из пространства пользователя выполнить системный вызов, который вызовет утечку памяти в модуле?

Ответы [ 2 ]

18 голосов
/ 07 мая 2011

Если вам нужно проверить, нет ли в модуле ядра утечки памяти, а ваша машина имеет архитектуру x86, вы можете использовать систему KEDR , она включает в себя детектор утечки памяти.

KEDR не требует от вас перестраивать ядро.В интерактивных документах (см., Например, «Начало работы») описано, как установить и использовать KEDR.Короче говоря, процедура выглядит следующим образом.

Установка (из источника): исходный архив untar - cmake <...> - make - make install

Запустите KEDR перед загрузкой модуля:

$ kedr start <name_of_the_module_to_analyze> -f leak_check.conf

Затем вы можете загрузить свой модуль и работать с ним как обычно.После того, как вы выгрузите его, KEDR предоставит вам отчет в debugfs (обычно debugfs монтируется в /sys/kernel/debug), например:

$ cat /sys/kernel/debug/kedr_leak_check/info
Target module: "...", 
Memory allocations: 3
Possible leaks: 2
Unallocated frees: 0

Файл possible_leaks из /sys/kernel/debug/kedr_leak_check/ предоставляет информацию (адрес,размер, стек вызовов) для каждого просочившегося блока памяти.

Наконец, вы можете остановить KEDR (обратите внимание, что /sys/kernel/debug/kedr_leak_check/ исчезнет):

kedr stop

Если вы используете систему с архитектуройкроме x86, Kmemleak также может быть полезен, хотя его немного сложнее использовать.Вам, вероятно, потребуется пересобрать ядро ​​с параметром CONFIG_DEBUG_KMEMLEAK, установленным в 'y'.Тем не менее, Kmemleak тоже очень полезный инструмент.Подробности смотрите в Documentation / kmemleak.txt в исходных текстах ядра.

0 голосов
/ 06 мая 2011
  1. Код утечки памяти, когда он выделяет блок памяти (например, с kmalloc()), а затем теряет все ссылки на этот блок памяти, не освобождая его в первую очередь.Ваш код этого не сделал, так как у вас все еще есть область действия var, указывающая на ваш блок памяти.Если вы добавите var = NULL; в следующую строку, то у вас будет истинная утечка памяти.

  2. И это абсолютно возможно, чтобы событие в пользовательском пространстве вызвало вашемодуль ядра для начала выделения памяти.Я не уверен, что вы можете сделать это напрямую с помощью системного вызова, но если вы не можете, есть ряд других способов выполнить задачу.Вам просто нужно выбрать один и реализовать его.Даже такая простая вещь, как наличие заранее определенного файла, который вы touch каждый раз хотите инициировать выделение памяти, должна работать.Хотя я не понимаю, почему ваш код init_module не может порождать поток, который периодически выделяет память со временем, если вы хотите именно такое поведение.

...