Memory Leak 을 찾아주는 Tool을 보셨나요?

hyper9의 이미지


Memory Leak을 찾아주는 Tool들이 있다고 해서
여기 저기 찾아보는 중이었는데요..

주로 memwatch, valgrind등 user space에서 동작하는
Application Program을 위한 것 같아서요.

혹시 Kernel Module의 memory leak을 찾아주는 tool을
알고 계시는 분이 계시지 않을까 해서요 ..

간단히 어떤 tool이 있더라 정도로 소개해 주셔도 좋을 것 같고요 ..

아님 제가 위에서 언급했던 memwatch, valgrind등의 tool이 Kernel
module의 memory leak도 detact할 수 있는건지,,

그것도 제가 잘못알고 있는거면 알려주시면 감사하겠습니다. ^^

dorado2의 이미지


마침 오늘 본 article에 관련된 내용이 있네요.

Kernel memory leak detector - http://lwn.net/Articles/309020/

물론 저는 사용해보지 않았습니다 :)

hyper9의 이미지

제가 발견했던 것과 같은 Page를 소개해 주셨네요..^^

저도 처음 보는 Tool이라 좀 더 조사해보고, update할 것 생기면
글을 또 올리겠습니다.

hyper9의 이미지

위에서 발견했던 그 tool이 지금은 kernel에 integrate되어 있는 것 같네요.

Kernel hacking
- Debug slab memory allocations
- Memory leak debugging

이렇게 찾아 들어가면 될 것 같고요 ..

저도 이제 막 써보려고 준비하는 중이라서, 아직은 더 update할 게 없네요.
뭔가 더 발견하면 글을 올리겠습니다.

아 ~ 그거 !
하고 벌써 아시는 분들도 많을 텐데,,,조언 주시면 언제나 환영 합니다. ^^

hyper9의 이미지

이 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이 존재하는)

에고 모르는 게 많아서 고생중입니다. ㅜㅜ
조언 부탁 드리고 싶네요 ~

dorado2의 이미지


p0가 아니라 p1 옵션을 사용하시면 될 것 같네요.

diff --git a/Documentation/kmemleak.txt b/Documentation/kmemleak.txt
에서 a/, b/ 이렇게 한 단계만 벗겨내기 위해서요.

여기 KLDP에도 관련 문서가 있으니 참고하세요.

http://wiki.kldp.org/wiki.php/DiffAndPatch

시도해보시고 좋은 결과 있으시면 공유 부탁드립니다 :)

hyper9의 이미지

덕분에 patch는 잘하고,,아래와 같은 정보를 얻었는데요 ..
이제는 이걸 어떻게 분석하고 이해해야 하는지가 숙제네요 ~ ㅜㅜ
암튼 kmemleak이 주는 정보는 첨부와 같습니다.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon kmemleak.txt15.81 KB
hyper9의 이미지

위의 글에 제가 첨부로 올려놓은 kmemleak의 출력을 보면요,,

kmemleak: object 0xdc8ca22c:

이런 식으로 leak이 발생한 곳을 말해 주고 있는 것 같은데요..
0xd~로 시작하는 곳이면 어느 위치인가 해서요.
대부분의 Kernel Symbol은 0xc~로 시작하는 것 같아서요 ..

조언 부탁드립니다. ^^

sokoban7의 이미지

저도 이 글들을 참고로 해보았습니다. 설치하는데도 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 파일을 확인해 가면서 메모리 관련 오류를 찾는데 생각보다는 만만치 않은것 같습니다.
이 툴을 이용해서 좀더 편안하게 메모리 오류를 찾는 방법이 있다면 가르쳐 주시면 감사합니다.

잘못된 내용이나 틀린 내용은 언제나 조언 부탁드립니다. 감사합니다.

hyper9의 이미지

오랫만에 다시와보니, 예전에 했던 걸 적어놓은 게 새삼스럽네요.
오늘의 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

이 내용을 좀 더 들여다보고, 추가할 내용이 있으면 또 글을 올리겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.