blob: 7d2db890c5c82d8847ad9efce6ceacc6077b0cd2 [file] [log] [blame]
Brendan Gregg0030d342016-01-28 22:39:23 -08001#!/usr/bin/python
2#
3# strlen_count Trace strlen() and print a frequency count of strings.
4# For Linux, uses BCC, eBPF. Embedded C.
5#
6# Written as a basic example of BCC and uprobes.
7#
8# Also see strlensnoop.
9#
10# Copyright 2016 Netflix, Inc.
11# Licensed under the Apache License, Version 2.0 (the "License")
12
13from __future__ import print_function
14from bcc import BPF
15from time import sleep
16
17# load BPF program
18b = BPF(text="""
19#include <uapi/linux/ptrace.h>
20
21struct key_t {
22 char c[80];
23};
24BPF_HASH(counts, struct key_t);
25
26int count(struct pt_regs *ctx) {
Brendan Greggeb1b70d2016-07-25 16:13:35 -070027 if (!PT_REGS_PARM1(ctx))
Brendan Gregg0030d342016-01-28 22:39:23 -080028 return 0;
29
30 struct key_t key = {};
31 u64 zero = 0, *val;
32
Brendan Greggeb1b70d2016-07-25 16:13:35 -070033 bpf_probe_read(&key.c, sizeof(key.c), (void *)PT_REGS_PARM1(ctx));
Brendan Gregg0030d342016-01-28 22:39:23 -080034 val = counts.lookup_or_init(&key, &zero);
35 (*val)++;
36 return 0;
37};
38""")
39b.attach_uprobe(name="c", sym="strlen", fn_name="count")
40
41# header
42print("Tracing strlen()... Hit Ctrl-C to end.")
43
44# sleep until Ctrl-C
45try:
46 sleep(99999999)
47except KeyboardInterrupt:
48 pass
49
50# print output
51print("%10s %s" % ("COUNT", "STRING"))
52counts = b.get_table("counts")
53for k, v in sorted(counts.items(), key=lambda counts: counts[1].value):
54 print("%10d \"%s\"" % (v.value, k.c.encode('string-escape')))