최근에 메모리에 관한 문제를 찾다가 응용프로그램이 아닌 

 커널의 메모리 누수에 대한 디버깅 방법을 찾게 되었습니다.


 그중에 이미 커널에 들어와 있는 memory leak debug 옵션을 찾았는데요

 바로 kernel memory leak detector 입니다.

 커널에서의 설정은 


 Kernel Configuration

Kernel hacking  --->

[*] Kernel memory leak detector

(4096) Maximum kmemleak early log entries

[ ] Default kmemleak to off (NEW)


 위와 같이 활성화 시키는 것으로 끝납니다.

default off 를 선택하시면 수동으로 켜주셔야 합니다.


 사용시에는 debugfs 가 mount 되어 있어야 합니다.

mount -t debugfs none /sys/kernel/debug


  해당 디렉토리에 kmemleak 파일이 없으면 아래와 같이 해보세요

dmesg | grep kmemleak

[    0.000000] kmemleak: Kernel memory leak detector disabled

[    0.000000] kmemleak: Early log buffer exceeded (462), please increase DEBUG_KMEMLEAK_EARLY_LOG_SIZE

   최대 로그 엔트리가 너무 작은 경우 입니다.

   최대 로그 엔트리를 키워주세요 


   이제 사용해 볼까요?

    clear 를 해서 로그를 지우고

    하고 싶은 작업을 합니다 드라이버나 기타 등등 작업을 합니다.

    scan 명령으로 의심스러운 메모리를 찾습니다.

    cat 명령으로 결과를 살펴봅니다.

     4개가 의심스럽다고 나오고 내용을 보여줍니다.


root:/sys/kernel/debug# echo clear > kmemleak 

root:/sys/kernel/debug# echo scan > kmemleak 

[   93.600000] kmemleak: 4 new suspected memory leaks (see /sys/kernel/debug/kmemleak)

root:/sys/kernel/debug# cat kmemleak 

unreferenced object 0xe7066400 (size 128):

  comm "swapper/0", pid 0, jiffies 4294667325 (age 105.563s)

  hex dump (first 32 bytes):

    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

    00 00 00 00 2c 53 94 c0 00 00 00 00 00 00 00 00  ....,S..........

  backtrace:

    [<c01ba0b0>] __kmalloc+0x140/0x25c

    [<c021c7fc>] __register_sysctl_paths+0x124/0x1c8

    [<c089ca90>] sysctl_init+0xc/0x18

    [<c0893854>] start_kernel+0x348/0x360

    [<400a8044>] 0x400a8044

    [<ffffffff>] 0xffffffff

unreferenced object 0xe7052e00 (size 64):

  comm "swapper/0", pid 0, jiffies 4294667326 (age 105.563s)

  hex dump (first 32 bytes):

    48 ff 9b c0 00 00 00 00 01 00 00 00 01 00 00 00  H...............

    00 00 00 00 00 00 00 00 20 ea 94 c0 20 ea 94 c0  ........ ... ...

  backtrace:

    [<c01ba0b0>] __kmalloc+0x140/0x25c

    [<c021bfdc>] __register_sysctl_table+0x4c/0x560

    [<c021c600>] register_leaf_sysctl_tables+0xf8/0x1d0

    [<c021c668>] register_leaf_sysctl_tables+0x160/0x1d0

    [<ffffffff>] 0xffffffff

unreferenced object 0xe7052e40 (size 64):

  comm "swapper/0", pid 0, jiffies 4294667326 (age 105.563s)

  hex dump (first 32 bytes):

    24 ff 9b c0 00 00 00 00 01 00 00 00 01 00 00 00  $...............

    00 00 00 00 00 00 00 00 20 ea 94 c0 20 ea 94 c0  ........ ... ...

  backtrace:

    [<c01ba0b0>] __kmalloc+0x140/0x25c

    [<c021bfdc>] __register_sysctl_table+0x4c/0x560

    [<c021c600>] register_leaf_sysctl_tables+0xf8/0x1d0

    [<c021c668>] register_leaf_sysctl_tables+0x160/0x1d0

    [<c021c828>] __register_sysctl_paths+0x150/0x1c8

    [<c089ca90>] sysctl_init+0xc/0x18

    [<c0893854>] start_kernel+0x348/0x360

    [<400a8044>] 0x400a8044

    [<ffffffff>] 0xffffffff

unreferenced object 0xe7052e80 (size 64):

  comm "swapper/0", pid 0, jiffies 4294667326 (age 105.563s)

  hex dump (first 32 bytes):

    00 ff 9b c0 00 00 00 00 01 00 00 00 01 00 00 00  ................

    00 00 00 00 00 00 00 00 20 ea 94 c0 20 ea 94 c0  ........ ... ...

  backtrace:

    [<c01ba0b0>] __kmalloc+0x140/0x25c

    [<c021bfdc>] __register_sysctl_table+0x4c/0x560

    [<c021c600>] register_leaf_sysctl_tables+0xf8/0x1d0

    [<c021c668>] register_leaf_sysctl_tables+0x160/0x1d0

    [<c021c828>] __register_sysctl_paths+0x150/0x1c8

    [<c089ca90>] sysctl_init+0xc/0x18

    [<c0893854>] start_kernel+0x348/0x360

    [<400a8044>] 0x400a8044

    [<ffffffff>] 0xffffffff