Memory Leak 을 찾아주는 Tool을 보셨나요?
글쓴이: hyper9 / 작성시간: 금, 2008/12/05 - 12:59오전
Memory Leak을 찾아주는 Tool들이 있다고 해서
여기 저기 찾아보는 중이었는데요..
주로 memwatch, valgrind등 user space에서 동작하는
Application Program을 위한 것 같아서요.
혹시 Kernel Module의 memory leak을 찾아주는 tool을
알고 계시는 분이 계시지 않을까 해서요 ..
간단히 어떤 tool이 있더라 정도로 소개해 주셔도 좋을 것 같고요 ..
아님 제가 위에서 언급했던 memwatch, valgrind등의 tool이 Kernel
module의 memory leak도 detact할 수 있는건지,,
그것도 제가 잘못알고 있는거면 알려주시면 감사하겠습니다. ^^
Forums:
마침 오늘 본 article에
마침 오늘 본 article에 관련된 내용이 있네요.
Kernel memory leak detector - http://lwn.net/Articles/309020/
물론 저는 사용해보지 않았습니다 :)
감사합니다..
제가 발견했던 것과 같은 Page를 소개해 주셨네요..^^
저도 처음 보는 Tool이라 좀 더 조사해보고, update할 것 생기면
글을 또 올리겠습니다.
한가지 추가로 알게되었는데요 ,,
위에서 발견했던 그 tool이 지금은 kernel에 integrate되어 있는 것 같네요.
Kernel hacking
- Debug slab memory allocations
- Memory leak debugging
이렇게 찾아 들어가면 될 것 같고요 ..
저도 이제 막 써보려고 준비하는 중이라서, 아직은 더 update할 게 없네요.
뭔가 더 발견하면 글을 올리겠습니다.
아 ~ 그거 !
하고 벌써 아시는 분들도 많을 텐데,,,조언 주시면 언제나 환영 합니다. ^^
조금 더 알게 된 내용은요 ...
이 kmemleak을 사용하기 위해서는 적절한 patch file을 찾아서
Linux Kernel을 patch해 주어야 하는 것 같았어요..
그리고 위에 처럼 설정을 하면 동작하지 않을까 생각 중입니다.
하지만,,지금은 좀 엉뚱하게 patch를 제대로 하지 못해서 막혀 있습니다..
patch file의 일부를 보면요 ...
diff --git a/Documentation/kmemleak.txt b/Documentation/kmemleak.txt
new file mode 100644
index 0000000..e952e80
--- /dev/null
+++ b/Documentation/kmemleak.txt
@@ -0,0 +1,157 @@
+Kernel Memory Leak Detector
+===========================
+
+
+Introduction
+------------
+
+Kmemleak provides a way of detecting possible kernel memory leaks in a
+way similar to a tracing garbage collector
+(http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29#Tracing_garbage_collectors),
+with the difference that the orphan pointers are not freed but only
+reported via /sys/kernel/debug/memleak. A similar method is used by
+the Valgrind tool (memcheck --leak-check) to detect the memory leaks
+in user-space applications.
+
+
이 내용을 보면 Documentation directory아래에 kmemleak.txt 라는 file을
update하려고 하는 것처럼 이해가 되었는데요 ...
막상 patch를 하고나니, Documentation directory에 kmemleak.txt라는 file이
생기는 것이 아니고, b/Documentation/kmemleak.txt라는 file이 생겨버렸네요.
결국은 patch를 시작한 위치에서 b라는 directory가 생긴 현상인데요 ..
아무래도 뭔가 잘못된 것 같아 질문을 드립니다.
참 patch를 하기 위해서 실행했던 command는 다음과 같습니다..
# patch -p0 < /home/mydir/tool/patch-2.6.19-rc1-kmemleak-0.11
patch를 실행한 current directory는 Linux Kernel의 가장 상위 directory입니다. (.config file이 존재하는)
에고 모르는 게 많아서 고생중입니다. ㅜㅜ
조언 부탁 드리고 싶네요 ~
p0가 아니라 p1 옵션을
p0가 아니라 p1 옵션을 사용하시면 될 것 같네요.
diff --git a/Documentation/kmemleak.txt b/Documentation/kmemleak.txt
에서 a/, b/ 이렇게 한 단계만 벗겨내기 위해서요.
여기 KLDP에도 관련 문서가 있으니 참고하세요.
http://wiki.kldp.org/wiki.php/DiffAndPatch
시도해보시고 좋은 결과 있으시면 공유 부탁드립니다 :)
감사합니다..
덕분에 patch는 잘하고,,아래와 같은 정보를 얻었는데요 ..
이제는 이걸 어떻게 분석하고 이해해야 하는지가 숙제네요 ~ ㅜㅜ
암튼 kmemleak이 주는 정보는 첨부와 같습니다.
한가지 추가 질문이 또 있는데요 ^^
위의 글에 제가 첨부로 올려놓은 kmemleak의 출력을 보면요,,
kmemleak: object 0xdc8ca22c:
이런 식으로 leak이 발생한 곳을 말해 주고 있는 것 같은데요..
0xd~로 시작하는 곳이면 어느 위치인가 해서요.
대부분의 Kernel Symbol은 0xc~로 시작하는 것 같아서요 ..
조언 부탁드립니다. ^^
제가 해본데 까지 정리해 봅니다.
저도 이 글들을 참고로 해보았습니다. 설치하는데도 KDB에 비해서 약간 시간이 오래 걸리는것 같습니다.
그리고 kmemleak 자체가 약간 불안정 해서 커널 패닉도 자주 떨어 지는 편이고요... ^_^ 그래도 Kernel
space 에서의 메모리 leak 을 프로파일 해주는 마땅한 툴을 찾지 못해서 사용하고 있습니다.
우선 설치는 각 커널 버전에 맞게 파일을 다운 받아서 아래와 같이 했습니다. 다운 받은 파일은
/usr/src/kernel 에 넣어두는것이 가장 편한것 같습니다.
#bunzip2 patch-file-name.bz2
#cd /usr/src/kernel//
#cat ../patch-file-name | patch -p1
위와 같이 하시고 에러가 없다면 패치가 잘 된것 같습니다. 이 부분에서 혹시 KDB랑 함께 kmemleak을 띄우신
분들은 KDB를 꺼주시기 바랍니다. KDB랑 같이 했더니 커널이 잘 않올라 가고 올라가더라도 불안정 하더군요
그런 다음 make menuconfig 하셔서 kernel hacking 들어가시면 위에 분이 말씀하신 것처럼
Kernel hacking
- Debug slab memory allocations
- Memory leak debugging
같은 옵션이 보입니다. 해당 옵션을 체크 하시고 config를 빠져 나오신후 커널을 make 하여 설치 하시면 됩니다.
잘 설치 되어 부팅이 완료 되었다면 아래의 명령어로 kmemleak 의 기능을 켤수 있습니다.
#mount -t debugfs nodex /sys/kernel/debug/
위와 같이 하면 cat으로 읽을수 있는 /sys/kernel/debug/memleak 파일이 생깁니다.
해당 파일을 읽어 보시면 아래와 같은 구조로 되어 있습니다.
orphan pointer 0xcece6cac (size 172):
c1061013:
orphan pointer 0xc95fcef8 (size 1828):
c1060eae: <__kmalloc_track_caller>
orphan pointer 0xceafbe44 (size 40):
c1060a25: <__kmalloc>
orphan pointer 0xc95fd704 (size 1828):
c1060eae: <__kmalloc_track_caller>
위의 내용을 간단하게 말씀드리면 orphan pointer (즉 고아 포인터)가 커널 메모리 구조상의 0xc95fd704 번지에 크기가
1828인 것이 발생하였으며 해당 발생 함수의 커널내 함수 주소는 c1060eae 이며 함수의 심볼은 __kmalloc_track_caller
입니다.
위의 내용을 KDB에서 보시면 c1060eae 가 가리키는 주소가 kmalloc_track_caller 라는것을 아실수 있습니다.
이렇게 memleak 파일을 확인해 가면서 메모리 관련 오류를 찾는데 생각보다는 만만치 않은것 같습니다.
이 툴을 이용해서 좀더 편안하게 메모리 오류를 찾는 방법이 있다면 가르쳐 주시면 감사합니다.
잘못된 내용이나 틀린 내용은 언제나 조언 부탁드립니다. 감사합니다.
오랫만에 kmemleak을 써야하는 일이 생겼네요.
오랫만에 다시와보니, 예전에 했던 걸 적어놓은 게 새삼스럽네요.
오늘의 test 결과는 아래와 같구요.
# cat kmemleak
unreferenced object 0xffff88007b6fd2d0 (size 16):
comm "homeagent", pid 815, jiffies 4295145613 (age 3506.296s)
hex dump (first 16 bytes):
00 00 00 00 00 00 00 00 0a 14 1d 02 00 00 00 00 ................
backtrace:
[] kmemleak_alloc+0x49/0xb0
[] kmem_cache_alloc+0xac/0x180
[] myip_tunnel_ioctl+0x4ce/0x620 [myip]
[] dev_ifsioc+0x303/0x350
[] dev_ioctl+0x4c5/0x5f0
[] sock_ioctl+0x110/0x280
[] do_vfs_ioctl+0x305/0x520
[] sys_ioctl+0x81/0xa0
[] system_call_fastpath+0x16/0x1b
[] 0xffffffffffffffff
unreferenced object 0xffff88007b6fd430 (size 16):
comm "homeagent", pid 815, jiffies 4295305039 (age 2868.592s)
hex dump (first 16 bytes):
00 00 00 00 00 00 00 00 0a 14 1d 02 00 00 00 00 ................
backtrace:
[] kmemleak_alloc+0x49/0xb0
[] kmem_cache_alloc+0xac/0x180
[] myip_tunnel_ioctl+0x4ce/0x620 [myip]
[] dev_ifsioc+0x303/0x350
[] dev_ioctl+0x4c5/0x5f0
[] sock_ioctl+0x110/0x280
[] do_vfs_ioctl+0x305/0x520
[] sys_ioctl+0x81/0xa0
[] system_call_fastpath+0x16/0x1b
[] 0xffffffffffffffff
이 내용을 좀 더 들여다보고, 추가할 내용이 있으면 또 글을 올리겠습니다.
댓글 달기