diff --git a/man/man8/memleak.8 b/man/man8/memleak.8 index c8bf241aaba8..ddce0e4acabc 100644 --- a/man/man8/memleak.8 +++ b/man/man8/memleak.8 @@ -3,7 +3,7 @@ memleak \- Print a summary of outstanding allocations and their call stacks to detect memory leaks. Uses Linux eBPF/bcc. .SH SYNOPSIS .B memleak [-h] [-p PID] [-t] [-a] [-o OLDER] [-c COMMAND] [-s SAMPLE_RATE] -[-T TOP] [-z MIN_SIZE] [-Z MAX_SIZE] [INTERVAL] [COUNT] +[-T TOP] [-z MIN_SIZE] [-Z MAX_SIZE] [-O OBJ] [INTERVAL] [COUNT] .SH DESCRIPTION memleak traces and matches memory allocation and deallocation requests, and collects call stacks for each allocation. memleak can then print a summary @@ -53,6 +53,9 @@ Capture only allocations that are larger than or equal to MIN_SIZE bytes. \-Z MAX_SIZE Capture only allocations that are smaller than or equal to MAX_SIZE bytes. .TP +\-O OBJ +Attach to malloc and free in specified object instead of resolving libc. Ignored when kernel allocations are profiled. +.TP INTERVAL Print a summary of oustanding allocations and their call stacks every INTERVAL seconds. The default interval is 5 seconds. diff --git a/tools/memleak.py b/tools/memleak.py index 04f0fea57a57..80cef0818687 100755 --- a/tools/memleak.py +++ b/tools/memleak.py @@ -135,6 +135,8 @@ def run_command_get_pid(command): help="capture only allocations larger than this size") parser.add_argument("-Z", "--max-size", type=int, help="capture only allocations smaller than this size") +parser.add_argument("-O", "--obj", type=str, default="c", + help="attach to malloc & free in the specified object") args = parser.parse_args() @@ -149,6 +151,7 @@ def run_command_get_pid(command): top_stacks = args.top min_size = args.min_size max_size = args.max_size +obj = args.obj if min_size is not None and max_size is not None and min_size > max_size: print("min_size (-z) can't be greater than max_size (-Z)") @@ -251,11 +254,11 @@ def run_command_get_pid(command): if not kernel_trace: print("Attaching to malloc and free in pid %d, Ctrl+C to quit." % pid) - bpf_program.attach_uprobe(name="c", sym="malloc", + bpf_program.attach_uprobe(name=obj, sym="malloc", fn_name="alloc_enter", pid=pid) - bpf_program.attach_uretprobe(name="c", sym="malloc", + bpf_program.attach_uretprobe(name=obj, sym="malloc", fn_name="alloc_exit", pid=pid) - bpf_program.attach_uprobe(name="c", sym="free", + bpf_program.attach_uprobe(name=obj, sym="free", fn_name="free_enter", pid=pid) else: print("Attaching to kmalloc and kfree, Ctrl+C to quit.") diff --git a/tools/memleak_example.txt b/tools/memleak_example.txt index d8df388c2358..5b6f8d4ac862 100644 --- a/tools/memleak_example.txt +++ b/tools/memleak_example.txt @@ -150,14 +150,16 @@ of the sampling rate applied. USAGE message: # ./memleak -h -usage: memleak [-h] [-p PID] [-t] [-a] [-o OLDER] [-c COMMAND] - [-s SAMPLE_RATE] [-d STACK_DEPTH] [-T TOP] +usage: memleak.py [-h] [-p PID] [-t] [-a] [-o OLDER] [-c COMMAND] + [-s SAMPLE_RATE] [-T TOP] [-z MIN_SIZE] [-Z MAX_SIZE] + [-O OBJ] [interval] [count] Trace outstanding memory allocations that weren't freed. Supports both user-mode allocations made with malloc/free and kernel-mode allocations made with kmalloc/kfree. +positional arguments: interval interval in seconds to print outstanding allocations count number of times to print the report before exiting @@ -175,13 +177,12 @@ optional arguments: execute and trace the specified command -s SAMPLE_RATE, --sample-rate SAMPLE_RATE sample every N-th allocation to decrease the overhead - -d STACK_DEPTH, --stack_depth STACK_DEPTH - maximum stack depth to capture -T TOP, --top TOP display only this many top allocating stacks (by size) -z MIN_SIZE, --min-size MIN_SIZE capture only allocations larger than this size -Z MAX_SIZE, --max-size MAX_SIZE capture only allocations smaller than this size + -O OBJ, --obj OBJ attach to malloc & free in the specified object EXAMPLES: