kmemleak: Dump object information on request
By writing dump=<addr> to the kmemleak file, kmemleak will look up an object with that address and dump the information it has about it to syslog. This is useful in debugging memory leaks. Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
af98603dad
commit
189d84ed54
2 changed files with 26 additions and 0 deletions
|
@ -42,6 +42,7 @@ Memory scanning parameters can be modified at run-time by writing to the
|
|||
scan=<secs> - set the automatic memory scanning period in seconds
|
||||
(default 600, 0 to stop the automatic scanning)
|
||||
scan - trigger a memory scan
|
||||
dump=<addr> - dump information about the object found at <addr>
|
||||
|
||||
Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
|
||||
the kernel command line.
|
||||
|
|
|
@ -331,6 +331,7 @@ static void dump_object_info(struct kmemleak_object *object)
|
|||
object->comm, object->pid, object->jiffies);
|
||||
pr_notice(" min_count = %d\n", object->min_count);
|
||||
pr_notice(" count = %d\n", object->count);
|
||||
pr_notice(" flags = 0x%lx\n", object->flags);
|
||||
pr_notice(" backtrace:\n");
|
||||
print_stack_trace(&trace, 4);
|
||||
}
|
||||
|
@ -1307,6 +1308,27 @@ static int kmemleak_release(struct inode *inode, struct file *file)
|
|||
return seq_release(inode, file);
|
||||
}
|
||||
|
||||
static int dump_str_object_info(const char *str)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct kmemleak_object *object;
|
||||
unsigned long addr;
|
||||
|
||||
addr= simple_strtoul(str, NULL, 0);
|
||||
object = find_and_get_object(addr, 0);
|
||||
if (!object) {
|
||||
pr_info("Unknown object at 0x%08lx\n", addr);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&object->lock, flags);
|
||||
dump_object_info(object);
|
||||
spin_unlock_irqrestore(&object->lock, flags);
|
||||
|
||||
put_object(object);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* File write operation to configure kmemleak at run-time. The following
|
||||
* commands can be written to the /sys/kernel/debug/kmemleak file:
|
||||
|
@ -1318,6 +1340,7 @@ static int kmemleak_release(struct inode *inode, struct file *file)
|
|||
* scan=... - set the automatic memory scanning period in seconds (0 to
|
||||
* disable it)
|
||||
* scan - trigger a memory scan
|
||||
* dump=... - dump information about the object found at the given address
|
||||
*/
|
||||
static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
|
||||
size_t size, loff_t *ppos)
|
||||
|
@ -1358,6 +1381,8 @@ static ssize_t kmemleak_write(struct file *file, const char __user *user_buf,
|
|||
}
|
||||
} else if (strncmp(buf, "scan", 4) == 0)
|
||||
kmemleak_scan();
|
||||
else if (strncmp(buf, "dump=", 5) == 0)
|
||||
ret = dump_str_object_info(buf + 5);
|
||||
else
|
||||
ret = -EINVAL;
|
||||
|
||||
|
|
Loading…
Reference in a new issue