Exact leak location in KMemleak Output

Sengottuvelan S sengottuvelan.s at gmail.com
Wed Dec 22 16:44:29 EST 2010


Sankar and All,

I followed blow investigation on detecting kernel memory leak. I got
different o/p which is different from yours shown.
ie, 4 and 5 lines are addresses in the backtrace and not function names.
http://psankar.blogspot.com/2010/11/detecting-memory-leaks-in-kernel.html

  comm "insmod", pid 1559, jiffies 4294961804 (age 229.610s)
  hex dump (first 32 bytes):
    fa 3e 00 00 00 00 00 00 92 5a 00 00 00 00 00 00  .>.......Z......
    0a 00 00 00 12 00 00 00 3c 38 00 00 00 00 00 00  ........<8......
  backtrace:
    [<ffffffff8156eb1d>] kmemleak_alloc+0x2d/0x60
    [<ffffffff81152469>] __vmalloc_node+0xc9/0xe0
    [<ffffffff8115280c>] vmalloc+0x2c/0x30
    [<ffffffffa0099047>] 0xffffffffa0099047
    [<ffffffffa009906c>] 0xffffffffa009906c
    [<ffffffff8100204c>] do_one_initcall+0x3c/0x1a0
    [<ffffffff810cea1b>] sys_init_module+0xbb/0x200
    [<ffffffff81041072>] system_call_fastpath+0x16/0x1b
    [<ffffffffffffffff>] 0xffffffffffffffff


On Wed, Oct 27, 2010 at 12:24 PM, Sankar P <sankar.curiosity at gmail.com>wrote:

> Hi Dave, Rajat, Mulyadi and everyone,
>
>
> Thanks for your pointers.
>
> Now I removed the "static __init" from the hello_init function and I
> got an output of:
>
> unreferenced object 0xf9042000 (size 512):
>  comm "insmod", pid 12068, jiffies 13995923 (age 51.096s)
>  hex dump (first 32 bytes):
>    6f 64 75 6c 65 00 00 00 00 00 00 2e 73 79 6d 74  odule.......symt
>    61 62 00 2e 73 74 72 74 61 62 00 2e 73 68 73 74  ab..strtab..shst
>  backtrace:
>    [<c10b0001>] create_object+0x114/0x1db
>    [<c148b4d0>] kmemleak_alloc+0x21/0x3f
>    [<c10a43e9>] __vmalloc_node+0x83/0x90
>    [<c10a44b9>] vmalloc+0x1c/0x1e
>    [<f9036021>] init_module+0x21/0x2f [hello_kernel]
>    [<c1001226>] do_one_initcall+0x71/0x113
>    [<c1056c48>] sys_init_module+0x1241/0x1430
>    [<c100284c>] sysenter_do_call+0x12/0x22
>    [<ffffffff>] 0xffffffff
>
>
> And, if I create a new function named myfunc and do my allocations
> inside that function (instead of the init function), even though I
> have a "static __init" text in the init_function I get an output:
>
> unreferenced object 0xf9061000 (size 512):
>  comm "insmod", pid 12750, jiffies 14401507 (age 110.217s)
>  hex dump (first 32 bytes):
>    1c 0f 00 00 01 12 00 00 2a 0f 00 00 01 12 00 00  ........*.......
>    38 0f 00 00 01 12 00 00 bc 0f 00 00 01 12 00 00  8...............
>  backtrace:
>    [<c10b0001>] create_object+0x114/0x1db
>    [<c148b4d0>] kmemleak_alloc+0x21/0x3f
>    [<c10a43e9>] __vmalloc_node+0x83/0x90
>    [<c10a44b9>] vmalloc+0x1c/0x1e
>    [<f9055021>] myfunc+0x21/0x23 [hello_kernel]
>    [<f9058012>] 0xf9058012
>    [<c1001226>] do_one_initcall+0x71/0x113
>    [<c1056c48>] sys_init_module+0x1241/0x1430
>    [<c100284c>] sysenter_do_call+0x12/0x22
>    [<ffffffff>] 0xffffffff
>
> As we can see from the above output, it shows both the function name
> as well as the module name where the leak is happening. Also the
> address of the statement. So, my problem seems to be solved. Thank you
> all for your pointers.
>
> Sorry for the top post and long contents.
>
> On Thu, Oct 28, 2010 at 12:00 AM, Rajat Sharma <fs.rajat at gmail.com> wrote:
> > try removing static __init from function definition
>  > On Wed, Oct 27, 2010 at 10:40 PM, Sankar P <sankar.curiosity at gmail.com>
> > wrote:
> >>
> >> Hi,
> >>
> >> I have an out of tree kernel module with the source:
> >>
> >> static __init int hello_init(void)
> >> {
> >>       char *ptr;
> >>       ptr = vmalloc(512);
> >>       ptr = vmalloc(512);
> >>       ptr = vmalloc(512);
> >>
> >>       printk(KERN_ALERT "Hello World");
> >>
> >>       return 0;
> >> }
> >>
> >> Now I compile this file (hello.c) using my Makefile as follows:
> >>
> >> EXTRA_CFLAGS=-g
> >> obj-m := hello-kernel.o
> >> hello-kernel-objs := hello.o
> >>
> >>
> >> Now if I insmod my hello-kernel.ko file and then do a `cat
> >> /sys/kernel/debug/kmemleak` I get an output:
> >>
> >> unreferenced object 0xf8211000 (size 512):
> >>  comm "insmod", pid 9602, jiffies 3666022 (age 1553.469s)
> >>  hex dump (first 32 bytes):
> >>   01 12 00 00 f2 10 00 00 01 12 00 00 fe 10 00 00  ................
> >>   01 12 00 00 0c 11 00 00 01 12 00 00 1a 11 00 00  ................
> >>  backtrace:
> >>   [<c10b0001>] create_object+0x114/0x1db
> >>   [<c148b4d0>] kmemleak_alloc+0x21/0x3f
> >>   [<c10a43e9>] __vmalloc_node+0x83/0x90
> >>   [<c10a44b9>] vmalloc+0x1c/0x1e
> >>   [<f8208021>] 0xf8208021
> >>   [<c1001226>] do_one_initcall+0x71/0x113
> >>   [<c1056c48>] sys_init_module+0x1241/0x1430
> >>   [<c100284c>] sysenter_do_call+0x12/0x22
> >>   [<ffffffff>] 0xffffffff
> >>
> >>
> >> I understand that the kmemleak has correctly detected the memory leak.
> >> But why is the leak showing in insmod , instead of the actual function
> >> name "hello_init". Is there a way we can get the exact location inside
> >> the hello.c file printed instead of the generic "insmod" location  ?
> >>
> >> If I do a `gdb hello-kernel.ko`, the symbols are properly resolved, so
> >> I am sure the .ko file has symbols.
> >>
> >> Any help will be appreciated. Thank you.
> >>
> >> --
> >> Sankar P
> >> http://psankar.blogspot.com
> >>
> >> --
> >> To unsubscribe from this list: send an email with
> >> "unsubscribe kernelnewbies" to ecartis at nl.linux.org
> >> Please read the FAQ at http://kernelnewbies.org/FAQ
> >>
> >
> >
>
>
>
> --
> Sankar P
> http://psankar.blogspot.com
>
> --
> To unsubscribe from this list: send an email with
> "unsubscribe kernelnewbies" to ecartis at nl.linux.org
> Please read the FAQ at http://kernelnewbies.org/FAQ
>
>


-- 
Regards,
S. Sengottuvelan.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20101222/9689c104/attachment-0001.html 


More information about the Kernelnewbies mailing list