Memory Leak debugging 에 대한 질문 입니다.
Kernel 쪽의 memory leak여부를 검증해보려는 목적으로 Kernel Option중에 있는
Memory Leak debugging 기능을 살려서 사용해보려고 하는 중입니다.
일단 Kernel hacking 쪽의 option은 아래와 같이 설정을 했습니다.
#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
# CONFIG_PRINTK_TIME is not set
# CONFIG_ENABLE_WARN_DEPRECATED is not set
# CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_UNUSED_SYMBOLS is not set
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
CONFIG_DETECT_SOFTLOCKUP=y
# CONFIG_SCHED_DEBUG is not set
# CONFIG_SCHEDSTATS is not set
# CONFIG_TIMER_STATS is not set
CONFIG_DEBUG_SLAB=y
CONFIG_DEBUG_SLAB_LEAK=y
# CONFIG_DEBUG_PREEMPT is not set
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_HIGHMEM is not set
CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_LIST is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_FRAME_POINTER is not set
# CONFIG_FORCED_INLINING is not set
# CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_RCU_TORTURE_TEST is not set
# CONFIG_FAULT_INJECTION is not set
# CONFIG_SAMPLES is not set
CONFIG_EARLY_PRINTK=y
CONFIG_DEBUG_STACKOVERFLOW=y
# CONFIG_DEBUG_STACK_USAGE is not set
CONFIG_DEBUG_PAGEALLOC=y
# CONFIG_DEBUG_RODATA is not set
# CONFIG_4KSTACKS is not set
CONFIG_DOUBLEFAULT=y
그리고 하나의 module을 골라서 거기에
kmalloc(300, GFP_ATOMIC); 과 같은 line을 삽입했습니다.
제 추측으로는 이 module이 불릴 때마다 300 byte씩 할당이 되어야 할 것 같은데요.
일부러 해제하는 곳은 만들지 않았습니다.
그럼 이제 이 부분이 memory leak으로 제대로 인식되는가를 시험해 보고 싶었는데요.
위에 Option들처럼 Memory leak debugging을 가능하도록 설정하면
이런 memory leak이 detect되지 않을까요?
기대를 가지고 해보았는데, 전혀 detect 되지 않았네요.
일단
mount -t debugfs none /sys/kernel/debug 로 debug file system을 mount했고요
cat /sys/kernel/debug/memleak
으로 memory leak의 발생여부를 확인해 봤습니다.
이상이 제가 kernel memory leak debugging option을 써서 Kernel module안에 만들어 넣은
memory leak이 발생하는 부분을 detect해보려고 시도한 내용인데요.
결과가 아무것도 보이지 않는걸로 봐서는 뭔가를 잘 못한 것 같아서요.
조언을 부탁드릴 수 있을까요?
뭔가 힌트를 주시면, 다시 해보고 결과를 올리겠습니다. ^^
미리 감사드립니다. ~
kmemleak을 porting 하는 중에 생긴 warning 입니다.
Web을 뒤지다 보니, 2.6.20 Kernel을 위한 kmemleak은 있는데, 2.6.24 용은 없는 것 같아서요.
porting 비슷하게, code를 옮겨놓고, compile을 해보니, 다음고 같은 warning이 나오던데요.
전에 본적이 없던거라, 조언을 부탁드립니다.
어떤 이유로 발생하는걸까요 ~
WARNING: vmlinux.o(.text+0x4f47a): Section mismatch: reference to .init.data:preinit_pos (between 'memleak_ignore' and 'memleak_not_leak')
WARNING: vmlinux.o(.text+0x4f48b): Section mismatch: reference to .init.data:preinit_objects (between 'memleak_ignore' and 'memleak_not_leak')
WARNING: vmlinux.o(.text+0x4f495): Section mismatch: reference to .init.data: (between 'memleak_ignore' and 'memleak_not_leak')
WARNING: vmlinux.o(.text+0x4f49d): Section mismatch: reference to .init.data:preinit_pos (between 'memleak_ignore' and 'memleak_not_leak')
WARNING: vmlinux.o(.text+0x4f595): Section mismatch: reference to .init.data:preinit_pos (between 'memleak_not_leak' and 'memleak_free')
WARNING: vmlinux.o(.text+0x4f5a6): Section mismatch: reference to .init.data:preinit_objects (between 'memleak_not_leak' and 'memleak_free')
WARNING: vmlinux.o(.text+0x4f5b0): Section mismatch: reference to .init.data: (between 'memleak_not_leak' and 'memleak_free')
WARNING: vmlinux.o(.text+0x4f5b8): Section mismatch: reference to .init.data:preinit_pos (between 'memleak_not_leak' and 'memleak_free')
WARNING: vmlinux.o(.text+0x4f6b2): Section mismatch: reference to .init.data:preinit_pos (between 'memleak_free' and 'memleak_scan_area')
memory leak의 판단 기준은 어떤게 될까요?
System에 memory가 정말로 부족해서 생기는 문제와 memory leak이 발생하는 경우와
어떻게 구별을 해낼수 있을까요?
상당한 경우는 구별이 모호할 것 같아서요.
예를 들어 제가 사용하는 System에 한 Server program을 실행해 봤습니다.
그 Server에 client에서 session을 설정할 수 있는 그런 구조인데요.
session의 수가 늘어나면 free memory가 점점 감소합니다.
그러다가 maximum으로 연결을 해보니 free memory가 10MB정도 남는게 보이네요.
참 이때의 System은 512MB의 Physical memory를 가지고 있었습니다.
그런후에, session을 close / open하는 것을 반복시켜보니,
결국 남아있던 10MB의 free memory가 고갈되었는지, oom-killer가 동작하면서
server를 죽여버리네요,
그래서 이번에는 이 server program을 2GB의 physical memory가 있는 system으로
옮겨서 실행을 해보았습니다.
한 5일째 전혀 문제가 안 보이네요
하지만 한 50일쯤 두면 문제가 보이는 건 아닐까 하는 걱정도 듭니다.
이런 경우에 SW에 memory leak이 있다고 봐야하는지, 아닌지 그 판단기준이 애매해서
다른 분들은 어떻게 판단하시는지 궁금합니다.
조언 주시면 감사하겠습니다. ^^
댓글 달기